我想要计算一个HSV图像的直方图的均值和标准差,但我只想对V通道进行直方图和计算。
我已经阅读了一些关于如何为一组通道完成这项工作的示例,并尝试了这些方法,但当我尝试执行程序时,我对是否正确创建仅使用一个通道的直方图感到困惑,因为程序总是崩溃。
以下是我目前的代码(变量test是cv :: Mat图像,可以是您想用来重现问题的任何图像)。 我可能错过了一些明显的东西,for循环可能在值范围方面不正确,但我以前没有使用过C ++进行此操作。
我已经阅读了一些关于如何为一组通道完成这项工作的示例,并尝试了这些方法,但当我尝试执行程序时,我对是否正确创建仅使用一个通道的直方图感到困惑,因为程序总是崩溃。
以下是我目前的代码(变量test是cv :: Mat图像,可以是您想用来重现问题的任何图像)。 我可能错过了一些明显的东西,for循环可能在值范围方面不正确,但我以前没有使用过C ++进行此操作。
cv::cvtColor(test, test, CV_BGR2HSV);
int v_bins = 50;
int histSize[] = { v_bins };
cv::MatND hist;
float v_ranges[] = { 0, 255};
cv::vector<cv::Mat> channel(3);
split(test, channel);
const float* ranges[] = { v_ranges };
int channels[] = {0};
cv::calcHist(&channel[2], 1, channels, cv::Mat(), hist, 1, histSize, ranges, true, false); //histogram calculation
float mean=0;
float rows= hist.size().height;
float cols = hist.size().width;
for (int v = 0; v < v_bins; v++)
{
std::cout << hist.at<float>(v, v) << std::endl;;
mean = mean + hist.at<float>(v);
}
mean = mean / (rows*cols);
std::cout << mean<< std::endl;;
cv::vector
是可以使用的。详情请参见此处。 - Miki