簡體   English   中英

OpenCV Draw繪制2個最大對象的輪廓

[英]OpenCV Draw draw contours of 2 largest objects

我正在使用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 ++環境中編碼

查看兩個最大輪廓的最簡單方法是簡單地查看輪廓的大小。 這樣的事情應該可以解決問題:

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

似乎vector<vector<Point> > contours存儲了所有輪廓。 您需要做的是對該向量進行迭代,並對它的元素進行一些算術運算,以便能夠檢測到向量中的2個最大輪廓。

在這個答案上,我共享了檢測vector<vector<Point> >最大輪廓的代碼,因此您已經到了一半。

暫無
暫無

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

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