1
我有一個圖像,我用cvFindContours() - 我將結果存儲在imageContours中。然後我試圖找到兩個最大的輪廓,並只顯示它們。但由於某種原因,它表現出超過2個輪廓。我的算法有什麼問題?謝謝OpenCV找到最大的輪廓?
編輯:哦,還有,在控制檯中,我不斷收到「錯誤」消息,我編程下面如果沒有任何選項是真實的。有人知道爲什麼
cvFindContours (binMask, imageContoursMem, &imageContours, sizeof (CvContour), CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE); //find the contours in binMask, and store results in ImageContours
//following conditions used to set f_handContour to the bigger contour for the first time, and s_handContour to the smaller contour for the first time
if ((cvContourArea (imageContours, CV_WHOLE_SEQ)) > (cvContourArea((imageContours -> h_next), CV_WHOLE_SEQ)))
{ //begin first contour bigger condition
f_handContour = imageContours;
s_handContour = (imageContours -> h_next);
} //end second contour bigger condition
else if ((cvContourArea (imageContours, CV_WHOLE_SEQ)) < (cvContourArea((imageContours -> h_next), CV_WHOLE_SEQ)))
{ //begin second contour bigger condition
f_handContour = (imageContours -> h_next);
s_handContour = imageContours;
} //begin second contour biggger condition
else if ((cvContourArea (imageContours, CV_WHOLE_SEQ)) == (cvContourArea((imageContours -> h_next), CV_WHOLE_SEQ)))
{ //begin contours equal condition
f_handContour = imageContours; //if contours equal assignment of contours doesn't matter
s_handContour = (imageContours -> h_next);
} //end contours equal condition
else
{ //begin error condition
cout<<"Error";
} //end error condition
while ((imageContours -> h_next) != NULL)
{ //start of biggest/second biggest contour recognition loop
imageContours = (imageContours -> h_next);
if (cvContourArea (f_handContour, CV_WHOLE_SEQ) < cvContourArea (imageContours, CV_WHOLE_SEQ))
{ //start of next contour bigger than f_handContour condition
s_handContour = f_handContour;
f_handContour = imageContours;
} //end start of next contour bigger than f_handContour condition
else if (cvContourArea (f_handContour, CV_WHOLE_SEQ) > cvContourArea (imageContours, CV_WHOLE_SEQ))
{ //start of next contour smaller than f_handContour condition
if (cvContourArea (s_handContour, CV_WHOLE_SEQ) < cvContourArea (imageContours, CV_WHOLE_SEQ))
{ //startof next contour bigger than s_handContour condition
s_handContour = imageContours;
} //end of next contour bigger than s_handContour condition
else if (cvContourArea (s_handContour, CV_WHOLE_SEQ) > cvContourArea (imageContours, CV_WHOLE_SEQ))
{ //start of next contour smaller than s_handContour condition
//just pass on contour
} //end of next contour smaller than s_handContour condition
else if (cvContourArea (s_handContour, CV_WHOLE_SEQ) == cvContourArea (imageContours, CV_WHOLE_SEQ))
{ //start of next contour equal to s_handContour condition
//just pass on contour
} // end of next contour equal to s_handContour condition
else
{ //start of error condition
cout<<"Error";
} //end of error condition
} //end of next contour smaller than f_handContour Condition
else if (cvContourArea (f_handContour, CV_WHOLE_SEQ) == cvContourArea (imageContours, CV_WHOLE_SEQ))
{ //start of next contour equal to f_handContour condition
if (cvContourArea (s_handContour, CV_WHOLE_SEQ) < cvContourArea (imageContours, CV_WHOLE_SEQ))
{ //startof next contour bigger than s_handContour condition
s_handContour = imageContours;
} //end of next contour bigger than s_handContour condition
else
{ //start of error condition
cout<<"Error";
} //end of error condition
} //end of next contour equal to f_handContour condition
else
{ //start of error condition
cout<<"Error";
} //end of error condition
} //end of biggest/second biggest contour recognition loop
cvDrawContours (output, f_handContour, cvScalar (0,255,0), cvScalar (0,255,255), 1, 3,8, cvPoint (0,0)); //draws the first hand contour derived from binMask on ouput
cvDrawContours (output, s_handContour, cvScalar (0,255,0), cvScalar (0,255,255), 1, 3,8, cvPoint (0,0)); //draws the second hand contour derived from binMask on ouput
謝謝你,完美的工作:) – fdh