所以我一直在继续我的opencv学习,并且正在努力完成直方图功能。我清楚地了解了calchist函数,我的代码在那里工作,它的绘图我不明白。
我意识到我将使用线函数在两点之间形成一条直线,但给出的点坐标确实让我很困惑。
我正在关注它的在线教程:http://docs.opencv.org/doc/tutorials/imgproc/histograms/histogram_calculation/histogram_calculation.html我也在关注OpenCV第2版的食谱。
根据在线教程的行计算在步骤7,如下:
for( int i = 1; i < histSize; i++ )
{
line( histImage, Point( bin_w*(i-1), hist_h - cvRound(b_hist.at<float>(i-1)) ) ,
Point( bin_w*(i), hist_h - cvRound(b_hist.at<float>(i)) ),
Scalar( 255, 0, 0), 2, 8, 0 );
line( histImage, Point( bin_w*(i-1), hist_h - cvRound(g_hist.at<float>(i-1)) ) ,
Point( bin_w*(i), hist_h - cvRound(g_hist.at<float>(i)) ),
Scalar( 0, 255, 0), 2, 8, 0 );
line( histImage, Point( bin_w*(i-1), hist_h - cvRound(r_hist.at<float>(i-1)) ) ,
Point( bin_w*(i), hist_h - cvRound(r_hist.at<float>(i)) ),
Scalar( 0, 0, 255), 2, 8, 0 );
}
老实说我很难理解这个,还有hist_h和hist_w的值,为什么选择了512和400?
所以我为此查阅了我的书,并发现同样的问题:
// Compute histogram first
cv::MatND hist= getHistogram(image);
// Get min and max bin values
double maxVal=0;
double minVal=0;
cv::minMaxLoc(hist, &minVal, &maxVal, 0, 0);
// Image on which to display histogram
cv::Mat histImg(histSize[0], histSize[0],
CV_8U,cv::Scalar(255));
// set highest point at 90% of nbins
int hpt = static_cast<int>(0.9*histSize[0]);
// Draw a vertical line for each bin
for( int h = 0; h < histSize[0]; h++ ) {
float binVal = hist.at<float>(h);
int intensity = static_cast<int>(binVal*hpt/maxVal);
// This function draws a line between 2 points
cv::line(histImg,cv::Point(h,histSize[0]),
cv::Point(h,histSize[0]-intensity),
cv::Scalar::all(0));
}
return histImg;
}
这里第二点cv::Point(h,histSize[0]-intensity)
的坐标是我不明白的。为什么减去强度呢?
这可能是一个非常愚蠢的问题,但是对不起,我只是不明白这里给出的坐标..我用Google搜索了足够的例子,并没有找到任何帮助来清除它。
所以我在这里问的是,任何人都可以向我解释任何一种方法中给出的坐标系。我真的很感激。
谢谢
P.S。我还想在这里注意到histsize = 256
答案 0 :(得分:1)
谈论第二个代码示例。
在OpenCV中,坐标系从左上角开始。因此,矩阵的入口0,0位于左上角,0,(cols-1)位于右上角,(行-1),0位于左下角和(行-1),(cols- 1)在右下角。
人类期望直方图从图像的底部开始。为了达到这个目的,你要否定坐标并从(行-1)开始而不是0.在你的例子中,rows == histsize[0]
。
坐标…,histsize[0]
无效!矩阵行从0
到histsize[0] - 1
!