我试图在二值化图像中找到最大的轮廓。从这个问题和本教程来看,你会认为这是微不足道的,我同意。但是,当我在下图中运行我的代码时,它会产生错误。注意左上角的 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 亿)。