【问题标题】:Find straight line segments in image using OpenCV使用 OpenCV 查找图像中的直线段
【发布时间】:2014-09-21 03:37:57
【问题描述】:

使用 OpenCV 的 findContours() 我有一个图像中的轮廓列表。我只对直线感兴趣,所以如果它们太“弯曲”,就应该被拒绝。问题是如何评估每个轮廓的直线度?

我查看了 fitLine(),但似乎没有返回拟合优度度量。我可以使用返回的行自行评估。

我查看 arcLength() 的目的是将其与边界矩形尺寸进行比较,但即使对于有些直线,如果轮廓点密集,弧长也可能相对较长。

我可以找到凸包并与边界矩形尺寸进行比较,但我必须分析凸面缺陷。

这里有什么有用的时刻吗?

【问题讨论】:

  • 线条不完全是图像中的轮廓。请问您为什么不使用霍夫线变换来检测这些线?
  • 对于我手头的问题,我需要找到轮廓,但了解它们的直线度也很有用。
  • 您可以使用点-线距离平方和除以点数作为拟合优度指标。
  • "我只对直线感兴趣"但迟到了"我需要找到轮廓,但知道它们有多直也很有用"。你对这个问题的限制是矛盾的。
  • 试试 LSD:线段检测器。这张纸看起来真的很好。 OpenCV 3.0 中有一个实现,但我还没有尝试过:docs.opencv.org/trunk/modules/imgproc/doc/…

标签: opencv image-processing contour


【解决方案1】:
  1. 像现在这样找到轮廓
  2. 使用HoughLines()查找图像中的直线
  3. 计算轮廓和直线之间的重叠

【讨论】:

    【解决方案2】:

    在轮廓上取两个点(例如cv::approxPoly)并计算它们的绝对距离。然后通过两点之间的轮廓点并将所有距离相加。如果轮廓上的距离与绝对距离之间的差异大于某个阈值,则可以拒绝它。

    【讨论】:

      【解决方案3】:

      函数findContours() 已经以某种方式用线段近似轮廓。每个轮廓都由其周围的点列表表示。出于您的目的,只需计算轮廓中每对连续点的距离即可为您提供所有线段长度。

      这是一个例子:

      c = cnts[0]
      #d is the points in contour c shifted by one with wraparound (numpy.roll)
      d = np.roll(c, 1, axis=0)
      np.linalg.norm(c - d, axis = -1)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-28
        • 1970-01-01
        • 2019-01-21
        • 2011-06-13
        • 2016-04-27
        • 1970-01-01
        • 2012-02-05
        相关资源
        最近更新 更多