我试图在二值化图像中找到最大的轮廓。从this question和this tutorial判断,你会认为这是微不足道的,我同意。当我在the image below上运行我的代码时,会产生错误。注意左上角的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);
如果使用模式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亿)。
答案 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,之前不确定)
唐 祝你有美好的一天