2

私はボクシング グローブを検出する OpenCV ソフトウェアを実行しているため、2 つの最大の輪郭 (ボクシング グローブごとに 1 つ) のみを検出して描画したいと考えています。

私のソフトウェアはすべての輪郭を描画しますが、一部はノイズのみであり、もちろん必要ありません

輪郭を描画するための私のコード:

    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

2 つの最大の等高線を確認する最も簡単な方法は、単純に等高線のサイズを確認することです。このような何かがうまくいくはずです:

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つの最大の輪郭を検出できるようにすることです。

この回答では、で最大の輪郭を検出するコードを共有したvector<vector<Point> >ので、途中で完了します。

于 2013-02-22T00:07:15.300 に答える