关于C#:OpenCV:findContours异常

OpenCV: findContours exception

我的matlab代码是:

1
2
3
4
5
6
h = fspecial('average', filterSize);
imageData = imfilter(imageData, h, 'replicate');
bwImg = im2bw(imageData, grayThresh);

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

opencv代码是:

1
2
3
4
5
6
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);

这是我的image2black和white函数

1
2
3
4
5
6
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建议的那样,我不再有例外。但是值与预期的不同。


看看这个问题,该问题与您遇到的问题类似:Matlab和OpenCV为同一图像计算不同的图像矩m00。

基本上,链接文章中的OP试图通过在OpenCV和findContours来查找所有闭合轮廓的xy的第零个图像矩-实际上这只是区域>在MATLAB中。在MATLAB中,可以通过regionpropsArea属性进行访问,并根据您的MATLAB代码判断,您希望找到相同的数量。

从文章中可以看出,OpenCV和MATLAB在图像中查找轮廓的方式之间肯定存在差异。这归结为两个平台都考虑"连接像素"的方式。 OpenCV仅使用四像素邻域,而MATLAB使用八像素邻域。

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

但是,由于与fspecial相比,cv::blur()的实现方式不同,平均掩码为偶数,因此您可能仍然无法沿图像的边界获得相同的结果。如果图像的边框周围没有重要的轮廓,则希望这将为您提供正确的结果。

祝你好运!