OpenCV找到最大的轮廓

OpenCV find biggest contours?

本文关键字:轮廓 OpenCV      更新时间:2023-10-16

我有一个图像,我使用cvFindContours () on-我存储在imageContours的结果。然后我试图找到两个最大的轮廓,只显示它们。但由于某种原因,它显示了多于两条等高线。我的算法有什么问题?由于

编辑:哦,还有,在控制台中,如果没有一个选项为真,我一直得到"错误"消息,我在下面编程。有人知道为什么吗?

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

CV_RETR_EXTERNAL只检索极端的外部轮廓。对于你的算法,你应该使用CV_RETR_LIST。尝试使用cvDrawContours函数的max_level值为0,因为值1绘制当前轮廓和与它在同一水平上的所有其他轮廓。你也可以优化你的条件很多(这是一种混乱),也存储在一些局部变量的区域,而不是调用cvContourArea那么多。