从OpenCV直方图中获取值

时间:2014-03-25 16:31:21

标签: opencv histogram

我在OpenCV中应该是一个简单的练习,但似乎无法使其正常工作。我试图确定图像一部分的边缘密度。这是我遵循的过程: 1.从图像中拉出子图像 2.使用Canny在subImage中查找边 3.创建二进制图像的阈值 4.为二进制图像创建直方图 5.得到二进制图像中的像素数" on" (255) 6.计算边缘密度" as numPixelsOn / totalPixels

我检查了上面1,2和3的结果,结果似乎没问题。步骤4和5似乎给了我麻烦。

这是我计算直方图的代码:

      int histSize = 256; // bin size
      float range[] = { 0, 256} ;
      const float* histRange = { range };

      bool uniform = true;
      bool accumulate = false;

      Mat hist;

      /// Compute the histograms:
      calcHist( &gray, 1, 0, Mat(), hist, 1, &histSize, &histRange, uniform, accumulate );

这似乎不起作用。当我在调用calcHist后检查hist时,它没有数据(即数据== 0)......或者我可能不理解我在看什么。

现在可以访问" bins"在直方图中,我尝试了很多东西。首先我尝试了这个:

  uchar* p;
  p = hist.ptr<uchar>(0);
  double edgePixels = p[255];

我也尝试过使用:

cvQueryHistValue_1D(hist,255); // #include <opencv2/legacy/compat.hpp>

这不会编译。给出2个错误:&#39; cv :: Mat&#39;没有超载的会员&#39;运营商 - &gt;&#39;和&#39; bins&#39;:不是&#39; cv :: Mat&#39;

的成员

我想我需要一些帮助。

1 个答案:

答案 0 :(得分:4)

你的第3个参数 - 通道中有一个错误,应该是一个数组,所以你应该像这样调用它

 int histSize = 256; // bin size
 float range[] = { 0, 256} ;
 const float* histRange = { range };

 bool uniform = true;
 bool accumulate = false;

 Mat hist;

 int channels[] = {0};

 /// Compute the histograms:
 calcHist( &gray, 1, channels, Mat(), hist, 1, &histSize, &histRange, uniform, accumulate );

你也应该致电:

hist.at<float>(0);

为了获得你的价值,OpenCV将它们存储为浮点数,这就是你在使用uchar时获得0的原因,因为uchar小于float并且数字存储的数量足够小以至于不能填充第一口。