【问题标题】:Remove contour defects [OpenCV]去除轮廓缺陷 [OpenCV]
【发布时间】:2017-06-27 07:44:36
【问题描述】:

我想概括一下这个问题:How to crop away convexity defects。 描述的情况对我来说很清楚,但我有更复杂的情况:我的轮廓不仅可以有凸面,而且可以有凹面缺陷:

蓝色是我拥有的轮廓,红色是我想要的矩形 - 它通常可以旋转矩形,所以我需要面积尽可能接近给定轮廓的 4 点矩形轮廓。我正在寻找如何实现这个转换函数的算法,如果能用代码说明就好了。

【问题讨论】:

  • 也许在您链接到的问题中描述的内容之后尝试convexHull
  • @slawekwin 我们事先不知道我们有什么类型的轮廓。它可能包含凸面缺陷,也可能不包含凹面缺陷

标签: c++ algorithm opencv


【解决方案1】:

我的想法是在轮廓上执行Hough transform 并选择前 4 条最突出的线作为矩形的边缘。

您应该将轮廓绘制为黑白图像并将其传递给HoughLines。它将返回一个由(r, theta) 对组成的向量,这些向量对检测到的线进行极坐标编码。请参阅this example 了解如何将它们转换回笛卡尔坐标。

线条将按“投票”数量递减(即沿线条的像素强度总和)进行排序。

注意HoughLinesP 不太适合手头的问题,因为它返回行,而不是行。

【讨论】:

  • 这很有趣。你能解释一下吗?我是否正确理解我们需要将轮廓(由“cv::findContours”返回)存储到 cv::Mat,然后对其执行“cv::HoughLinesP”?
  • 霍夫变换的输入是灰度图像,其中像素强度表示边缘的“强度”。在您的情况下,轮廓已经二值化,因此它将是二值(黑/白)图像。然后,HoughLines 或 HoughLinesP 将为您提供按“强度”降序排列的找到线列表。在您的情况下,这意味着较长的共线段将位于列表的开头,因此只要缺陷边缘不长于矩形边缘,前 4 行将是您的矩形。
  • 由于您从findContours 获得的轮廓是一个点向量,因此您需要将轮廓绘制为灰度图像,然后再将其传递给霍夫变换。您可以为此使用drawContours
  • @TamásZahola 您可以在答案中提及您的 cmets:D
【解决方案2】:

链接答案中的方法只能处理基于与凸包的偏差的凸性缺陷,我认为您不能使用相反的方法来消除“凹形缺陷”(它会增大凸包并使 其他特征的缺陷)。

您可以尝试以下方法:

  • 运行链接答案中的解决方案以消除凸缺陷
  • 在生成的特征上,使用不同的精度参数(例如 0.0、0.5、1.0...)迭代调用 cv::ApproxPoly,直到它接近 4 边形状。

【讨论】:

    猜你喜欢
    • 2014-08-23
    • 2013-09-03
    • 2020-06-14
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    相关资源
    最近更新 更多