2013-02-21 31 views
2

我做检测的拳击手套,因此我想检测和借鉴,只有2个最大的轮廓(每个拳击手套)一个软件OpenCV的轮廓。OpenCV的抽奖抽2个最大的对象

我的软件将轮廓的一切,有些东西是噪音仅ofcourse我不想

我绘制轮廓代码:

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)); 

     } 

这里有一个形象的例子:

enter image description here

我已经细分手套颜色方案,该problelem是,有时小轮廓r中绘制由于噪音而造成的地点。当然,手套轮廓当然是占主导地位的,这就是为什么我只想保持这些轮廓。希望这是我的问题更清晰

可能有人提出一个解决方案,请 我编码在C++环境 问候

+0

你应该发布一个示例图像。 – 2013-02-21 23:02:28

+0

@Tomazi请仔细阅读答案,并投票给那些帮助你的答案。您也可以点击答案附近的复选框将其选为您问题的正式答案。 – karlphillip 2013-03-21 17:27:19

回答

2

似乎vector<vector<Point> > contours存储所有的轮廓。你需要做的是对这个向量进行迭代,并对它进行一些运算,以便能够检测向量中最大的两个轮廓。

On this answer我共享检测在vector<vector<Point> >最大的轮廓代码,让你走了一半。

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);