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