私はボクシング グローブを検出する 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++環境でコーディングしています