2

我正在做一个检测拳击手套的 OpenCV 软件,因此我只想检测并绘制 2 个最大的轮廓(每个拳击手套一个)。

我的软件为所有东西绘制轮廓,有些东西只是我不想要的噪音

我绘制轮廓的代码:

    vector<vector<Point> > contours;
    vector<Vec4i> hierarchy;
    findContours(mBlur, contours, hierarchy, CV_RETR_EXTERNAL,  CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );
    //----------------------------------------------------------------------------->

    vector<vector<Point> > contours_poly(contours.size());
    vector<Rect> boundRect (contours.size());
    vector<Point2f> boundingBoxArea(boundRect.size());

    //----------------------------------------------------------------------------->

    for( int i = 0; i < contours.size(); i++ )
     { 
       approxPolyDP( Mat(contours[i]), contours_poly[i], 3, true );
       boundRect[i] = boundingRect( Mat(contours_poly[i]) );

     }

    /// Draw polygonal contour + bonding rects
   Mat drawing = Mat::zeros( range_out.size(), CV_8UC3 );

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

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

       }

这是一个图像示例:

在此处输入图像描述

我的程序已经按颜色对手套进行了分割,问题是有时由于噪声而在随机位置绘制小轮廓。现在当然手套轮廓占主导地位,这就是为什么我只想保留这些轮廓。希望这能让我的问题更清楚

有人可以建议一个解决方案吗?我在 C++ 环境中编码

4

2 回答 2

4

查看两个最大轮廓的最简单方法是简单地查看轮廓大小。这样的事情应该可以解决问题:

int largestIndex = 0;
int largestContour = 0;
int secondLargestIndex = 0;
int secondLargestContour = 0;
for( int i = 0; i< contours.size(); i++ )
{
    if(contours[i].size() > largestContour){
        secondLargestContour = largestContour;
        secondLargestIndex = largestIndex;
        largestContour = contours[i].size();
        largestIndex = i;
    }else if(contours[i].size() > secondLargestContour){
        secondLargestContour = contours[i].size();
        secondLargestIndex = i;
    }
}
Scalar color = Scalar(0,0,255);
drawContours( drawing, contours, largestIndex, color, CV_FILLED, 8);
drawContours( drawing, contours, secondLargestIndex, color, CV_FILLED, 8);
于 2013-05-14T11:55:26.063 回答
2

似乎vector<vector<Point> > contours存储了你所有的轮廓。您需要做的是迭代此向量并对其元素进行一些算术运算,以便能够检测到向量中的 2 个最大轮廓。

在这个答案中,我共享了检测 a 中最大轮廓的代码vector<vector<Point> >,所以你已经完成了一半。

于 2013-02-22T00:07:15.300 回答