C ++ OpenCV消除较小的轮廓

时间:2013-03-26 03:15:43

标签: c++ opencv

我正在开发一个OpenCV项目。

我目前正致力于检测特定投资回报率(Regoin Of Interest)的轮廓。我想要实现的是消除所有较小的轮廓,换句话说我不希望这些较小的轮廓完全被淹没。

如果我编写了这个算法来完成这项工作那么远:

CODE:

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&gt; 2000)语句没有被执行,即使面团我知道图像中存在的某些区域比这更大。

我一直在尝试很多不同的解决方案,但这看起来对我来说是最合适的。

关键问题:

是否有可能用给定的代码实现我想要的......? 如果是这样,任何人都可以看到我在哪里出错 否则有人可以建议某种解决方案或良好的在线资源......?

1 个答案:

答案 0 :(得分:1)

如果您想根据投资回报率的大小进行删除,您可以按照以下方式进行删除(基于bounding box of 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();并且如果它小于特定阈值,您可以将其消除。


如果您只想删除长度较小的轮廓,可以计算它的长度look at the answer to similar question,并且您似乎可以使用arcLength()函数。我认为是这样的:double perimeter = arcLength ( Mat ( contours[i] ), true );