C++ findContours,contourArea给出嵌套轮廓的错误&引用;断言失败"&引用;“输入数组不是有效的矩阵”;

C++ findContours,contourArea给出嵌套轮廓的错误&引用;断言失败"&引用;“输入数组不是有效的矩阵”;,c++,opencv,computer-vision,contour,C++,Opencv,Computer Vision,Contour,我试图在二值化图像中找到最大的轮廓。根据我的判断,你会认为这是微不足道的,我同意。但是,当我在上运行代码时,它会产生错误。注意左上角的2x2点,该点应算作一个轮廓 Mat img = imread("problem.png", CV_LOAD_IMAGE_GRAYSCALE); vector<vector<Point>> ContourVector; findContours(img, ContourVector, CV_RETR_LIST, CV_CHAIN_APPRO

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

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);

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


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

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

for (int i = 1; i != ContourVector.size(); ++i){
    if ( (contourArea(ContourVector[i])) > BiggestContourArea) {
        biggest = i;
        BiggestContourArea = contourArea(ContourVector[biggest]);
    }
}
在C++数组和向量中,p>从零开始索引。因此,向量中的第一项具有索引
0
,最后一项具有
轮廓向量.size()-1

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

for (int i = 1; i < ContourVector.size(); ++i)    ....
for(inti=1;i
这似乎是Visual Studio 2012与OpenCV提供的预构建库的兼容性问题。在我安装并使用VisualStudio2010运行代码后,问题消失了

我假设您也可以通过使用VS 2012从源代码构建OpenCV来解决这个问题,但我没有做到。有一本手册,但它已经过时了(git中没有“源”目录)

在VS 2012中,我在这个项目中也遇到了其他奇怪的问题,这与一些库问题是一致的。编译代码在调试和发布模式下运行良好,但在调试模式下执行它会出现错误。在发布模式下,它似乎可以工作,但它产生了一些错误,比如引发这个问题的错误


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

为了回应您上一篇文章(这似乎是一个兼容性问题…),您是否尝试在VS 2012中使用“/build/x86/vc11/lib”而不是vc10?我绝对不是专家,但这可能是图书馆的错配。(vc11肯定在2.4.6 openCV中,在此之前不确定)


祝您度过愉快的一天

您使用的是什么版本的OpenCV?你的代码对我来说很好。此外,使用
std::max_元素和自定义比较器,以及
std::distance
查找
最大值,您的比较逻辑可能更清晰。但这两种方法都有效。你在同一张照片上试过吗?我试过从2.4到2.6的所有OpenCV版本,它们都给出了相同的行为。我正在使用Visual Studio 2012,也许我应该尝试重新安装。我使用了您在OS X上发布的图片,版本为2.4.5。这本来会更干净,但无法修复它。错误发生在索引3处,该索引在大小为4时应该存在。
for (int i = 1; i != ContourVector.size(); ++i){
    if ( (contourArea(ContourVector[i])) > BiggestContourArea) {
        biggest = i;
        BiggestContourArea = contourArea(ContourVector[biggest]);
    }
}
for (int i = 1; i < ContourVector.size(); ++i)    ....