使用轮廓重绘对象的有效方法

时间:2013-02-25 06:56:28

标签: opencv

问题

拥有许多blob的图像。我需要删除不符合要求的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?

1 个答案:

答案 0 :(得分:0)

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