OpenCV - 如何从Canny函数的结果中提取边缘?

时间:2013-09-09 11:40:00

标签: c++ opencv

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

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

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

在OpenCV docs上写道

  

该函数在输入图像图像中查找边缘并将其标记为   使用Canny算法输出地图边缘。最小的价值   阈值1和阈值2之间用于边缘链接。该   最大值用于查找强边的初始段。

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

UPDATE 我以前用来测试的图片,此图片包含Canny功能的结果

enter image description here

4 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:3)

取决于您尝试检索的形状,

答案 2 :(得分:2)

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

你必须自己动手,看看berak对可能的惯例的回答。

答案 3 :(得分:2)

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

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

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