我仍在尝试理解直方图计算。正如我在另一篇文章中所说,我无法理解官方教程和我书中的教程。
我正在讨论的教程位于:http: //docs.opencv.org/doc/tutorials/imgproc/histograms/histogram_calculation/histogram_calculation.html
我真的很难阅读,尤其是绘制计算直方图的部分。它涉及拆分、规范化、没有任何解释的值,例如 hist_w 和 hist_h 的值,以及所有复杂的线函数。
所以我决定用一种简单的方式写下我学到的东西,只是为了看看直方图的工作原理,看看它是如何进行的。这是我写的:
int _tmain(int argc, _TCHAR* argv[])
{
Mat src, dst, final;
src = imread("c:\\car.jpg", 0);
int histsize = 256;
float range[] = {0, 256};
const float* histrange = { range };
bool uniform = true; bool accumulate = false;
calcHist(&src, 1, 0, Mat(), dst, 1, &histsize, &histrange, uniform, accumulate);
for(int h= 0; h<histsize; h++)
{
float value = dst.at<float>(h);
line(final, Point(h,(histsize-1)), Point(h, value), Scalar(0,0,0));
}
namedWindow("meh",CV_WINDOW_AUTOSIZE);
imshow("meh", final);
waitKey(0);
return 0;
}
图像以灰度加载,因此无需拆分。并且简单地应用了 calcHist 并使用 line 函数来绘制它。
但是它在调用时会出现未处理的异常错误。我相信这一定是因为我的线路功能过于简化。与在线教程一样,坐标的计算太复杂了。
但我认为这应该可行,让我解释一下。在第一个循环中,h 将为 0,因此坐标将为(0,255) and (0,[value of histogram at 0])
,类似地,在第二个循环中,坐标将为(1,255) and (1,[value of histogram at 0])
,依此类推..
这在理论上直方图是正确的。它应该工作..为什么不呢?
编辑:: 它在imshow("meh", final);