C++ findContours,contourArea给出嵌套轮廓的错误&引用;断言失败"&引用;“输入数组不是有效的矩阵”;
我试图在二值化图像中找到最大的轮廓。根据我的判断,你会认为这是微不足道的,我同意。但是,当我在上运行代码时,它会产生错误。注意左上角的2x2点,该点应算作一个轮廓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
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) ....