OpenCV:findContours异常

时间:2015-01-17 20:45:11

标签: c++ matlab opencv image-processing

我的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 at memory location 0x0000003F6E09E0A0。

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

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

更新2: 我添加了{Mamea建议的dst.convertTo(dst,CV_8U);,我不再有例外。但价值观与预期完全不同。

1 个答案:

答案 0 :(得分:1)

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

基本上,链接帖子中的OP试图通过使用{{1}找到所有封闭轮廓的xy的第0个图像时刻 - 实际上只是该区域在OpenCV中和MATLAB中的findContours。在MATLAB中,可以从regionprops的{​​{1}}属性访问,并且从MATLAB代码判断,您希望找到相同的数量。

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

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

但是,由于与findContours相比,cv::moments的实现方式不同,平均掩码为偶数,您仍然可能无法沿边框获得相同的结果< / strong>的图像。如果图像边界周围没有重要的轮廓,那么希望这会给你正确的结果。


祝你好运!