gpt4 book ai didi

opencv - 从 OpenCV 直方图中获取值

转载 作者:太空宇宙 更新时间:2023-11-03 21:04:08 24 4
gpt4 key购买 nike

我在 OpenCV 中进行了一个简单的练习,但似乎无法让它发挥作用。我正在尝试确定图像部分中的边缘密度。这是我遵循的过程:1.从图像中提取子图像2.使用Canny在subImage中寻找边缘3. 创建二值图像的阈值4. 为二值图像创建直方图5. 获取二值图像中“打开”的像素数 (255)6. 计算“边缘密度”为 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 个错误:“cv::Mat”没有重载成员“operator ->”,并且“bins”:不是“cv::Mat”的成员

我想我需要一些帮助。

最佳答案

你的第三个参数 - channels 有错误,它应该是一个数组,所以你应该这样调用它

 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);

为了获得您的值(value),OpenCV 将它们存储为 float ,这就是您在使用 uchar 时得到 0 的原因,因为 uchar 小于 float ,并且数字存储得足够小以至于无法填满第一口。

关于opencv - 从 OpenCV 直方图中获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22640799/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com