1

问题

具有许多斑点的图像。我需要删除不符合要求的 blob。然而,符合要求的斑点内部确实有一个洞。我需要重新绘制成功的 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

我想这里可能有两个问题。首先,您想删除在轮廓中找到的轮廓吗?为此,请使用 CV_RETR_EXTERNAL 而不是 CV_RETR_CCOMP。其次,您只想绘制未删除的轮廓?这更多地取决于您如何删除其他轮廓。解决此问题的一种简单快捷的方法是创建一个新的向量 > 和 push_back 轮廓,它们不会在您的 while 循环中被丢弃。

于 2013-02-25T17:50:44.230 回答