簡體   English   中英

C ++ OpenCV消除較小的輪廓

[英]C++ OpenCV Eliminate smaller Contours

我正在開發一個OpenCV項目。

我目前正在檢測特定ROI(感興趣區域)的輪廓。 我要實現的是消除所有較小的輪廓,換句話說,我根本不想淹沒這些較小的輪廓。

到目前為止,如果我已經對此算法進行了編碼即可完成此工作:

碼:

vector<vector<Point> > contours;
    vector<Vec4i> hierarchy;
    findContours(mBlur, contours, hierarchy, CV_RETR_EXTERNAL,  CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );
    //----------------------------------------------------------------------------->
    //Contours Vectors
    vector<vector<Point> > contours_poly(contours.size());
    vector<Rect> boundRect (contours.size());
    vector<Point2f> ContArea(contours.size());
    Mat drawing = Mat::zeros( range_out.size(), CV_8UC3 );
    //----------------------------------------------------------------------------->
    //Detecting Contours
    for( int i = 0; i < contours.size(); i++ )
     {  

        ContArea.clear();
        ContArea.push_back(Point2f(boundRect[i].x, boundRect[i].y));
        ContArea.push_back(Point2f(boundRect[i].x + boundRect[i].width, boundRect[i].y));
        ContArea.push_back(Point2f(boundRect[i].x + boundRect[i].width, boundRect[i].y + boundRect[i].height));
        ContArea.push_back(Point2f(boundRect[i].x, boundRect[i].y + boundRect[i].height));

        double area = contourArea(ContArea);

        if(area > 2000)
        {
           approxPolyDP( Mat(contours[i]), contours_poly[i], 3, true );
           boundRect[i] = boundingRect( Mat(contours_poly[i]));


           cout<<"The area of Contour: "<<i<< " is: " <<area<<endl;

        }
     }



    /// Draw polygonal contour + bonding rects


   //////////////////////////////////////////////////////////////////////////////////

    for( int i = 0; i< contours.size(); i++ )
    {

        Scalar color = Scalar(255,255,255);
        drawContours( drawing, contours_poly, i, color, 1, 8, vector<Vec4i>(), 0, Point() );
        fillPoly(drawing, contours, Scalar(255,0,0));

    }

這里的問題是,即使我知道圖像中存在的某些區域比這大得多,它似乎也不會執行if(area> 2000)語句。

我一直在嘗試許多不同的解決方案,但這似乎對我來說是最合適的。

關鍵問題:

是否可以通過給定的代碼實現我想要的...? 如果是這樣,誰能看到我在其他方面出了什么問題?有人可以提出某種解決方案或好的在線資源嗎?

如果要基於ROI的大小進行刪除,則可以執行以下操作(基於opencv邊界框示例):

vector< vector< Point > > contours_poly( contours.size() );
vector< Rect > boundRect (contours.size() );
vector< Point2f > centeres ( contours.size() );
vector< float > radiuses ( contours.size() );

// finding the approximate rectangle and circle of contours
for( int i = 0; i < contours.size(); i++ )
  {
    approxPolyDP( Mat ( contours[i] ), contours_poly[i], 3, true );
    boundRect[i] = boundingRect( Mat ( contours_poly[i] ) );
    minEnclosingCircle( ( Mat ) contours_poly[i], centeres[i], radiuses[i] );
  }

上面的代碼片段讓你的輪廓近似矩形( boundRect ),和近似圓( centersradiuses )。 之后,您必須能夠調用contourArea(); 如果它小於某個閾值,則可以消除它。


如果只想刪除特定長度較小的輪廓,則可以計算其長度, 查看類似問題的答案 ,似乎可以使用arcLength()函數。 我認為是這樣的: double perimeter = arcLength ( Mat ( contours[i] ), true );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM