2013-02-21 75 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);