1

所以我一直在继续我的 opencv 学习并且正在努力使用直方图函数。我清楚地了解 calchist 功能,我的代码一直工作到那里,我不明白它的绘图。

我意识到我将使用 line 函数在两点之间画一条线,但给出的点坐标真的让我很困惑。

我正在关注这里的在线教程: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)是我不明白的。至于为什么要减去它的强度?

这可能是一个非常愚蠢的问题,但我很抱歉,我只是不明白这里给出的坐标。我用谷歌搜索了足够多的例子,但没有找到任何帮助来解决这个问题。

所以我在这里问的是任何人都可以向我解释这两种方法中给出的坐标系。我真的很感激。

谢谢

PS我还想在这里指出 histsize = 256

4

1 回答 1

1

谈论第二个代码示例。

在 OpenCV 中,坐标系从左上角开始。所以矩阵的条目 0,0 在左上角,0,(cols-1) 在右上角,(rows-1),0 在左下角,(rows-1),(cols- 1)在右下角。

人类期望直方图从图像底部开始。为了实现这一点,您否定坐标并从 (rows-1) 而不是 0 开始。在您的示例中,rows == histsize[0].

您的代码有一个错误:

坐标…,histsize[0]无效!矩阵行从0histsize[0] - 1

于 2012-10-19T22:51:45.397 回答