我在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;
的成员我想我需要一些帮助。
答案 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并且数字存储的数量足够小以至于不能填充第一口。