31

我编写了一些代码,使用 OpenCV 库来检测画在草地上的白线。我需要有人对我使用的方法发表意见(因为我确信有比我更好的方法)。此外,我得到的结果并不像我预期的那么好,因为图像的细微变化需要调整参数(并且我需要对固定参数进行操作)。

到目前为止我的方法:

  1. 从网络摄像头抓取图像(并明显变成灰度)
  2. 通过阈值过滤器运行它(使用 THRESH_TO_ZERO 模式,它会将低于阈值的所有像素归零)。
  3. 模糊图像
  4. 通过侵蚀过滤器运行它
  5. 通过 Canny 边缘检测器运行它
  6. 最后,获取这个处理过的图像并使用概率霍夫变换 HoughLinesP 找到线条

我应该更改过滤器的顺序吗?

PS 我不太关心处理能力;我在 GPU B-) 上运行 HoughLinesP

此外,这是一个示例图像: 原始图像

我得到的结果:用精明 精明的 没有精明(稍微调整了参数) 这次没有精明

任何帮助或指导将不胜感激!我只是不知道该怎么做才能改善它!

更新 根据选择的答案使用非常快速的骨架实现(带有大量模糊)后,我得到了这个: 有用!

4

5 回答 5

22

我会尝试使用图像的骨架表示。在这里,您的精明的问题在于,由于线的宽度,它基本上会导致两条线。

然后我会对其应用霍夫变换。

于 2013-05-22T06:16:14.857 回答
5

一种可能的解决方案是获取您从精明边缘检测中获得的所有边缘点,并在这些点上使用线性最小二乘法(可能是迭代的)拟合一条线。这样,您总能得到一条“最适合”边缘点的线。这种方法实际上不涉及参数化。

于 2013-05-21T09:58:49.243 回答
5

我将 Canny 用于室内图像,但对于室外,我发现 Laplace 滤波器和 Sobel 滤波器比应用概率霍夫线变换 (PHT) 更合适。

如果你想加粗你的线条,你应该在 Laplace 之后尝试Sobel 算子,最后是 PHT。如果你的形象太爱管闲事,它可能会变得更糟。

于 2013-11-24T17:22:29.587 回答
1

RANSAC算法可能是一个很好的方法。这种方法类似于regressioninterpolation接近。您应该在使用后提取点(我认为edge detection最好的方法是实现这个目标)。canny然后你应该找到最好的线路。为了找到通过多个点的线,有不同的方法,例如线性回归或 RANSAC。您可以在此链接RANSAC中找到有关算法的实现和注释。

请注意,RANSAC 和另一个有用的算法already implementedOpenCV(正如我在 3.2 版中所知道的那样)和Accord NET(用于图像处理的免费库)。

于 2017-04-07T12:22:07.547 回答
0

根据您的最后一个结果(在骨架过滤器之后),您会得到许多小段。我认为你在这一点上处于一个非常好的位置来实施本文中所做的事情:

http://www.cs.ubc.ca/~lowe/papers/aij87.pdf

基本上,它们提供了工具来根据图像中不同特征属于同一对象的可能性来重新组合它们。所以你所要做的就是将你的结果提供给他们的算法,你可能会得到一条结果。

于 2018-01-26T21:37:53.570 回答