我有一个在OpenCV中应该很简单的练习,但是似乎无法让它正常工作。 我正在尝试确定图像部分的边缘密度。 我按照以下步骤进行:
1. 从图像中提取子图像
2. 使用Canny查找子图像中的边缘
3. 阈值化以创建二进制图像
4. 为二进制图像创建直方图
5. 获取二进制图像中“开启”(255)的像素数量
6. 计算“边缘密度”的公式为numPixelsOn/totalPixels
我已经检查了以上1,2和3步骤的结果,结果似乎还可以。 但第4和第5步似乎让我感到困扰。
下面是计算直方图的代码:
我也尝试使用:
这段代码无法编译。出现了两个错误:'cv::Mat'没有可重载的成员'operator ->',和'bins'不是'cv::Mat'的成员。我需要一些帮助。
我已经检查了以上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时,它没有数据(即data == 0)...或者我不明白我正在看什么。
现在要访问直方图中的“bins”,我尝试了许多方法。首先我尝试了这个:
uchar* p;
p = hist.ptr<uchar>(0);
double edgePixels = p[255];
我也尝试使用:
cvQueryHistValue_1D(hist,255); // #include <opencv2/legacy/compat.hpp>
这段代码无法编译。出现了两个错误:'cv::Mat'没有可重载的成员'operator ->',和'bins'不是'cv::Mat'的成员。我需要一些帮助。