Opencv 利用等高线重画物体的有效方法

Opencv 利用等高线重画物体的有效方法,opencv,Opencv,问题 有许多斑点的图像。我要求删除不符合要求的斑点。但是,满足要求的水滴内部确实有一个孔。我需要重新绘制成功的斑点。下面是我使用的一些代码。希望有人能指出如何处理它 /// Find contours vector<vector<Point> > contours; vector<Vec4i> hierarchy; cv::findContours( srcImg, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_AP

问题

有许多斑点的图像。我要求删除不符合要求的斑点。但是,满足要求的水滴内部确实有一个孔。我需要重新绘制成功的斑点。下面是我使用的一些代码。希望有人能指出如何处理它

/// Find contours
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
cv::findContours( srcImg, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE, Point(0,0) ); 
///查找等高线
矢量等值线;
向量层次;
cv::findContours(srcImg、等高线、层次、cv_RETR_CCOMP、cv_CHAIN_APPROX_NONE、点(0,0));
更多信息()

///开始迭代找到的每个轮廓
向量::迭代器itc=contours.begin();
向量矩形;
Mat dstImg=Mat::zeros(srcImg.size(),CV_8UC1);
//移除不在限制范围内的修补程序。
while(itc!=contours.end()){
///在这里消除斑点
}
///重新绘制轮廓。此处出错,因为某些Blob已被删除
int-idx=0;
对于(;idx>=0;idx=hierarchy[idx][0])
{
标量颜色(255、255、255);
绘制轮廓(dstImg、轮廓、idx、颜色、CV_填充、8、层次);
}
///重新绘制轮廓,但孔也已填充
for(无符号整数i=0;i

我必须再次使用FindTours吗?

我想这里可能有两个问题。首先,要删除在轮廓中找到的轮廓吗?为此,请使用CV_RETR_EXTERNAL而不是CV_RETR_CCOMP。其次,您只想绘制未删除的轮廓?这更多地取决于删除其他轮廓的方式。解决这个问题的一个简单而快速的方法是创建一个新的vector>并将轮廓推回,这样就不会在while循环中被丢弃。

我明白了。但是,如果我需要使用drawContours,即使孔也会被填充,对吗?参数CV_filled表示轮廓将被绘制填充。您可以更改此值,因为这不是您想要的。
/// 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() );
}