1

問題

多くのブロブを含む画像があります。要件を満たしていないブロブを削除する必要がありました。ただし、要件を満たすブロブには、内部に穴があります。成功したblobを再描画する必要があります。これが私が使用したコードの一部です。うまくいけば、誰かがそれに対処する方法を指摘することができます。

/// Find contours
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
cv::findContours( srcImg, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE, Point(0,0) ); 

詳細(http://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html?highlight=moments#findcontours

/// Start to iterate to each contour found

vector<vector<Point> >::iterator itc = contours.begin();
vector<Rect> rects;

Mat dstImg = Mat::zeros( srcImg.size(), CV_8UC1 );

    //Remove patch that are no inside limits.    
    while( itc != contours.end() ) {
    /// eliminating blobs here
    }

/// To redraw the contours. Error here since some blobs already been removed
int idx = 0;
for( ; idx >= 0; idx = hierarchy[idx][0] )
{
Scalar color( 255, 255, 255 );
drawContours( dstImg, contours, idx, color, CV_FILLED, 8, hierarchy );
}

/// To redraw the contours but the holes also filled
for(unsigned int i = 0; i < rects.size(); i++) {
Scalar color = Scalar(255,255,255);
drawContours( dstImg, contours, i, color, CV_FILLED, 8, noArray(), 0, Point() );
}

findContoursを再度使用する必要がありますか?

4

1 に答える 1

0

ここにはおそらく2つの問題があると思います。まず、輪郭内にある輪郭を削除しますか? これを行うには、CV_RETR_CCOMP の代わりに CV_RETR_EXTERNAL を使用します。次に、削除されていない輪郭のみを描画しますか? これは、他の輪郭をどのように削除したかによります。これを回避する簡単で迅速な方法は、while ループで破棄されない新しいベクトル > と push_back 輪郭を作成することです。

于 2013-02-25T17:50:44.230 に答える