gpt4 book ai didi

c++ - OpenCV:findContours 异常

转载 作者:行者123 更新时间:2023-11-28 06:28:56 25 4
gpt4 key购买 nike

我的 matlab 代码是:

h = fspecial('average', filterSize);
imageData = imfilter(imageData, h, 'replicate');
bwImg = im2bw(imageData, grayThresh);

cDist=regionprops(bwImg, 'Area');
cDist=[cDist.Area];

opencv代码为:

cv::blur(dst, dst,cv::Size(filterSize,filterSize));
dst = im2bw(dst, grayThresh);

cv::vector<cv::vector<cv::Point> > contours;
cv::vector<cv::Vec4i> hierarchy;
cv::findContours(dst,contours,hierarchy,CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE);

这是我的 image2blackand white 函数

cv::Mat AutomaticMacbethDetection::im2bw(cv::Mat src, double grayThresh)
{
cv::Mat dst;
cv::threshold(src, dst, grayThresh, 1, CV_THRESH_BINARY);
return dst;
}

我在 findContours() C++ 异常中遇到异常:内存位置 0x0000003F6E09E0A0 处的 cv::Exception。

你能解释一下我做错了什么吗?dst 是 cv::Mat,我一直使用它,它具有我的原始值。

更新这里是我写入 *.txt 文件的矩阵: http://www.filedropper.com/gili

更新 2:我添加了 dst.convertTo(dst,CV_8U); 就像 Micka 建议的那样,我不再有异常(exception)。然而,值与预期完全不同。

最佳答案

看看这个问题,它与您遇到的问题类似:Matlab and OpenCV calculate different image moment m00 for the same image .

基本上,链接帖子中的 OP 试图为所有闭合轮廓的 xy 找到第零个图像时刻 - 这实际上只是面积,通过在 OpenCV 中使用 findContours 和在 MATLAB 中使用 regionprops。在 MATLAB 中,可以通过 regionpropsArea 属性访问它,从您的 MATLAB 代码来看,您希望找到相同的数量。

从帖子中可以看出,OpenCV 和 MATLAB 在图像中查找轮廓的方式肯定存在差异。这归结为两个平台考虑什么是“连接像素”的方式。 OpenCV 仅使用四像素邻域,而 MATLAB 使用八像素邻域。

因此,您的实现没有任何问题,转换为 8UC1 是好的。但是,使用 MATLAB 和 OpenCV 找到的两个轮廓之间的面积(以及最终连接组件和轮廓本身的总数)并不相同。获得完全相同结果的唯一方法是,如果您在黑色图像上手动绘制 findContours 找到的轮廓,并直接使用 cv::moments 函数这个图片。

但是,由于 cv::blur() 与平均掩码均等的 fspecial 的不同实现,您仍然可能无法沿图像的边界 获得相同的结果。如果您的图像边界周围没有重要的轮廓,那么希望这会给您正确的结果。


祝你好运!

关于c++ - OpenCV:findContours 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28004133/

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