【问题标题】:OpenCV - How to extract edges form result of Canny Function?OpenCV - 如何从 Canny 函数的结果中提取边缘?
【发布时间】:2013-09-12 21:28:06
【问题描述】:

我在 OpenCV 中使用 Canny() 函数如下

Mat detected_edges = GetImage...;
Canny( detected_edges, detected_edges, 20, 20*3, kernel_size );

我的问题是这个函数的结果只有一个黑白图像,我想得到检测到的边缘集。

在 OpenCV 文档上写道

该函数在输入图像图像中找到边缘并将它们标记为 使用 Canny 算法的输出地图边缘。最小值 threshold1 和 threshold2 之间用于边缘链接。这 最大值用于寻找强边缘的初始段。

但我不知道如何从结果图像中提取线条,有人可以帮助我。

UPDATE下面是我用来测试的图片,这张图片包含了Canny函数的结果

【问题讨论】:

标签: c++ opencv


【解决方案1】:

正如 berak 所说,您可以尝试在边缘检测后使用 findContours 来查找连接的组件。这里还有另一个关于这个的stackoverflow问题: connected components in OpenCV

这是一个例子: http://docs.opencv.org/doc/tutorials/imgproc/shapedescriptors/find_contours/find_contours.html

请注意,在这种情况下,他们使用它来绘图,但您可以将其用于您选择的任何目的。

【讨论】:

    【解决方案2】:

    正如 berak 的回答指出的那样,您可以在执行 Canny 边缘检测后使用 findContoursHough 变换来查找线条。

    但我想补充一点,在执行 Canny 边缘检测和查找线之前进行一些图像处理可能会有所帮助。例如,您似乎在地板上有很多不需要的轮廓,并且在您的 Canny 结果周围还发现了白色“规格”。

    Smoothing 图像会有所帮助,也许还可以使用mean shift algorithm 按颜色分割图像。您可能想探索其他处理图像的新方法。

    【讨论】:

      【解决方案3】:

      Canny 算法不知道边缘的实际形状。这些花哨的一像素宽的线实际上是简单边缘检测 Sobel 算子的峰值,通过非极大值抑制提取。 Canny 不会将像素连接成链或段。它可能在内部形成连接组件以应用滞后阈值,但这是实现细节。

      您必须自己做,请参阅 berak 的回答以了解可能的例程。

      【讨论】:

        【解决方案4】:

        取决于您要检索的形状,

        【讨论】:

          猜你喜欢
          • 2017-12-13
          • 2017-07-21
          • 1970-01-01
          • 1970-01-01
          • 2013-08-07
          • 2012-08-12
          • 1970-01-01
          • 1970-01-01
          • 2021-07-20
          相关资源
          最近更新 更多