OpenCV轮廓演变

时间:2016-02-07 15:10:03

标签: opencv opencv3.0 opencv-contour

我有一个轮廓,我想“捕捉”到图像中的边缘。也就是说,像智能剪刀这样的东西,但同样的整个轮廓。用户提供了对象轮廓的粗略草图,我想通过将轮廓上的每个点“推”到边缘图像中的最近点来清理它。

OpenCV中是否存在类似的内容?

1 个答案:

答案 0 :(得分:0)

您可以按照建议使用cv::grabCut模仿活动轮廓。您可以选择吸引半径(曲线离原始位置的距离),通过使用扩张和侵蚀的图像,可以定义轮廓周围的未知区域。

// cv::Mat img, mask; // contour on mask as filled polygon
if ( mask.size()!=img.size() )
    CV_Error(CV_StsError,"ERROR");
int R = 32; // radius of attraction
cv::Mat strel = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(2*R+1,2*R+1) );
cv::Mat gc( mask.size(), CV_8UC1, cv::Scalar(cv::GC_BGD) );
cv::Mat t;
cv::dilate( mask, t, strel );
gc.setTo( cv::GC_PR_BGD, t );
gc.setTo( cv::GC_PR_FGD, mask ); // 3
cv::erode( mask, t, strel );
gc.setTo( cv::GC_FGD, t ); // 1
cv::grabCut( img, gc, cv::Rect(), cv::Mat(), cv::Mat(), 2 );
gc &= 0x1; // either foreground or probably foreground
gc *= 255; // so that you see it

您可能会松开的是轮廓的拓扑结构。那里需要一些处理。此外,您无法控制轮廓的曲率或平滑度,也不是真正意义上的轮廓演变。

只有当您感兴趣时,ITK测地线活动轮廓可能正是您所寻找的http://www.itk.org/Doxygen/html/classitk_1_1GeodesicActiveContourLevelSetImageFilter.html