我的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);
,我不再有例外。但价值观与预期完全不同。
答案 0 :(得分:1)
看看这个问题与您遇到的问题类似:Matlab and OpenCV calculate different image moment m00 for the same image。
基本上,链接帖子中的OP试图通过使用{{1}找到所有封闭轮廓的x
和y
的第0个图像时刻 - 实际上只是该区域在OpenCV中和MATLAB中的findContours
。在MATLAB中,可以从regionprops
的{{1}}属性访问,并且从MATLAB代码判断,您希望找到相同的数量。
从帖子中可以看出,OpenCV和MATLAB在图像中找到轮廓的方式肯定存在差异。这归结为两个平台都考虑什么是连接像素&#34;的方式。 OpenCV仅使用四像素邻域,而MATLAB使用八像素邻域。
因此,您的实施没有任何问题,转换为Area
是好的。但是,使用MATLAB和OpenCV找到的两个轮廓之间的区域(最终是连接组件和轮廓本身的总数)并不相同。获得完全相同结果的唯一方法是在黑色图像上手动绘制regionprops
找到的轮廓,并直接在此图像上使用8UC1
函数。
但是,由于与findContours
相比,cv::moments
的实现方式不同,平均掩码为偶数,您仍然可能无法沿边框获得相同的结果< / strong>的图像。如果图像边界周围没有重要的轮廓,那么希望这会给你正确的结果。