【问题标题】:OpenCV contour evolutionOpenCV 轮廓演化
【发布时间】:2023-03-30 20:26:01
【问题描述】:

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

OpenCV 中是否存在类似的东西?

【问题讨论】:

  • 我不认为 OpenCV 有现成的解决方案,但主动蛇模型往往可以很好地解决这个问题:en.wikipedia.org/wiki/Active_contour_model
  • 几张图片可能会有所帮助。智能剪刀使用主动轮廓、蛇形等。 OpenCV grabcut 应该很好用。您可以尝试提供肯定前景您的轮廓。

标签: opencv opencv3.0 opencv-contour


【解决方案1】:

您可以按照建议使用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

【讨论】:

  • 我知道你通过在轮廓周围设置未知区域是什么意思(大概我在 OpenCV 术语中将侵蚀和扩张区域之间的这个区域设置为“可能是前景”?),但你的意思是什么这里的“吸引力半径”?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-12
  • 2017-05-15
  • 2016-10-23
  • 2021-09-14
  • 2011-12-25
  • 1970-01-01
相关资源
最近更新 更多