OpenCV:findContours 异常
OpenCV: findContours exception
我的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++ 异常中遇到异常:cv::Exception 在内存位置 0x0000003F6E09E0A0。
你能解释一下我做错了什么吗?
dst 是 cv::Mat,我一直在使用它,它具有我的原始值。
更新这里是我写入 *.txt 文件的矩阵:
http://www.filedropper.com/gili
更新 2:
我已经按照 Micka 的建议添加了 dst.convertTo(dst,CV_8U);
,我不再有例外。但是值与预期完全不同。
看看这个问题,它与您遇到的问题类似:。
基本上,链接 post 中的 OP 试图为所有闭合轮廓的 x
和 y
找到第零个图像矩 - 实际上只是面积,通过在 OpenCV 中使用 findContours
和在 MATLAB 中使用 regionprops
。在 MATLAB 中,可以通过 regionprops
中的 Area
属性 访问,并且从您的 MATLAB 代码判断,您希望找到相同的数量。
从 post 可以看出,OpenCV 和 MATLAB 在图像中查找轮廓的方式肯定存在差异。这归结为两个平台考虑什么是 "connected pixel" 的方式。 OpenCV 仅使用四像素邻域,而 MATLAB 使用八像素邻域。
因此,您的实现没有任何问题,转换为 8UC1
很好。但是,使用 MATLAB 和 OpenCV 找到的两个轮廓之间的面积(以及最终连接组件和轮廓本身的总数)并不相同。获得完全相同结果的唯一方法是在黑色图像上手动绘制 findContours
找到的轮廓,并直接在此图像上使用 cv::moments
函数。
但是,由于 cv::blur()
的实现方式与 fspecial
的实现方式不同,平均掩码是偶数,您仍然可能无法沿着 [=34] 获得相同的结果=]borders 图像。如果您的图像边界周围没有重要的轮廓,那么希望这会给您正确的结果。
祝你好运!
我的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++ 异常中遇到异常:cv::Exception 在内存位置 0x0000003F6E09E0A0。
你能解释一下我做错了什么吗? dst 是 cv::Mat,我一直在使用它,它具有我的原始值。
更新这里是我写入 *.txt 文件的矩阵: http://www.filedropper.com/gili
更新 2:
我已经按照 Micka 的建议添加了 dst.convertTo(dst,CV_8U);
,我不再有例外。但是值与预期完全不同。
看看这个问题,它与您遇到的问题类似:
基本上,链接 post 中的 OP 试图为所有闭合轮廓的 x
和 y
找到第零个图像矩 - 实际上只是面积,通过在 OpenCV 中使用 findContours
和在 MATLAB 中使用 regionprops
。在 MATLAB 中,可以通过 regionprops
中的 Area
属性 访问,并且从您的 MATLAB 代码判断,您希望找到相同的数量。
从 post 可以看出,OpenCV 和 MATLAB 在图像中查找轮廓的方式肯定存在差异。这归结为两个平台考虑什么是 "connected pixel" 的方式。 OpenCV 仅使用四像素邻域,而 MATLAB 使用八像素邻域。
因此,您的实现没有任何问题,转换为 8UC1
很好。但是,使用 MATLAB 和 OpenCV 找到的两个轮廓之间的面积(以及最终连接组件和轮廓本身的总数)并不相同。获得完全相同结果的唯一方法是在黑色图像上手动绘制 findContours
找到的轮廓,并直接在此图像上使用 cv::moments
函数。
但是,由于 cv::blur()
的实现方式与 fspecial
的实现方式不同,平均掩码是偶数,您仍然可能无法沿着 [=34] 获得相同的结果=]borders 图像。如果您的图像边界周围没有重要的轮廓,那么希望这会给您正确的结果。
祝你好运!