findContours,contourArea给出嵌套轮廓的错误。 “断言失败”,“输入数组不是有效矩阵”

时间:2013-08-07 20:29:11

标签: c++ opencv computer-vision contour

我试图在二值化图像中找到最大的轮廓。从this questionthis tutorial判断,你会认为这是微不足道的,我同意。当我在the image below上运行我的代码时,会产生错误。注意左上角的2x2点,应该算作一个轮廓。

problem.png

Mat img = imread("problem.png", CV_LOAD_IMAGE_GRAYSCALE);
vector<vector<Point>> ContourVector;
findContours(img, ContourVector, CV_RETR_LIST, CV_CHAIN_APPROX_NONE);
//findContours(img, ContourVector, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);    // Alternative mode

int biggest = 0;
double BiggestContourArea = contourArea(ContourVector[biggest]);
for (int i = 1; i != ContourVector.size(); ++i){
if ( (contourArea(ContourVector[i])) > BiggestContourArea) {
    biggest = i;
    BiggestContourArea = contourArea(ContourVector[biggest]);
}
}
img = Scalar(0,0,0);
drawContours(img, ContourVector, biggest, Scalar(255,255,255), CV_FILLED );
imshow("Largest contour", img);
waitKey(0);

如果使用模式CV_RETR_LIST,我在i = 3时会出现此错误,尽管ContourVector的大小为4.但为什么矢量大于轮廓数?

"Assertion failed: (0 <= contourIdx && contourIdx < (int)last) in unknown function, file ..[..]contours.cpp, line 1810"

如果使用模式CV_RETR_EXTERNAL(这会更有意义),我会收到此错误。为什么会发生这种情况

OpenCV Error: Bad argument (input array is not a valid matrix)  in unknown function, file ..[..]utils.cpp, line 54

如果有人能解释这些错误,我将不胜感激。

我也想知道为什么循环中的contourArea的结果由于某种原因是0而且ContourVector [i] .size()给出了一个荒谬的大数(大约40亿)。

3 个答案:

答案 0 :(得分:0)

我无法判断CV_EXTERNAL情况。在第一种情况下,问题似乎很简单。

for (int i = 1; i != ContourVector.size(); ++i){
    if ( (contourArea(ContourVector[i])) > BiggestContourArea) {
        biggest = i;
        BiggestContourArea = contourArea(ContourVector[biggest]);
    }
}

在C ++中,数组和向量从零开始索引。因此,向量中的第一项具有索引0,最后一项具有ContourVector.size() - 1

要修复代码,只需将for循环更改为:

for (int i = 1; i < ContourVector.size(); ++i)    ....

答案 1 :(得分:0)

这似乎与Visual Studio 2012和OpenCV提供的预构建库存在兼容性问题。安装并使用Visual Studio 2010运行代码后,问题就消失了。

我认为您也可以通过使用VS 2012从源代码构建OpenCV来解决这个问题,但我没有管理。有一个手册here,但它已过时(git中没有“源”目录)。

我在VS 2012中的这个项目还有其他奇怪的问题,这与一些库存问题一致。编译代码在调试和发布模式下工作正常,但执行它在调试模式下出错。在发布模式下,似乎可以正常工作,但它会产生错误,例如引发此问题的错误。

对于协议,我将“/ build / x86 / vc10 / lib”链接为VS 2012中的附加库目录,并且使用OpenCV版本2.4.4到2.4.6生成错误。

答案 2 :(得分:0)

回复你的上一篇文章(这似乎是一个兼容性问题......),你是否尝试使用“/ build / x86 / vc11 / lib”代替vc10 for VS 2012?我绝不是专家,但这可能是图书馆的不匹配。 (vc11绝对是2.4.6 openCV,之前不确定)

唐 祝你有美好的一天