您可以 在这里 找到我的代码 。 它可能比文章还最新;)。
介绍
这是自动驾驶汽车系列的第一篇文章。 如果您想知道为什么我要分享此事以及更多有关旅程的信息,请阅读此书。
目标
对于给定视频的每个图像,我们将检测汽车两侧的行驶车道线,并在视觉上突出显示它们。

输入条件
车道检测算法的第一个迭代将在仪表板上有单个摄像头的非弯曲道路上很好地工作。 在这些图像中,天气状况良好,现在是白天。 我们将处理阴影,不同的线条颜色以及连续/不连续的车道。 以后需要做更多的工作才能在弯曲的道路上,在不同的光照和天气条件下进行这项工作。
算法:逐步
此算法在每个帧上逐步执行:
1:将图片转换为HSV。 如果您不熟悉HSV,那么与通常使用的经典RGB相比,它基本上是一种不同的颜色描述方式,您可以在Wikipedia上详细了解它。 稍后我们将解释为什么需要进行此转换。
2:我们在图片上应用高斯模糊。 它可以帮助我们减少噪点,使我们无法检测图片上微小的无关紧要的细节,例如树叶或距离很远的物体。
3:现在,我们希望滤除(变黑)不是车道颜色的任何像素,在这种情况下为白色或黄色。
这就是HSV转换派上用场的地方:它使我们可以通过关注像素的色相和饱和度(它是哪种颜色以及颜色的强度)来更轻松地过滤这些颜色,而不必关注其值(多黑),因此更容易处理阴影和整体较差的照明条件。

图像现在的元素要少得多,只有白色或淡黄色的元素带有一些误报,但我们的两行定义非常清晰。
4:我们使用Canny边缘检测。 Canny算法通过查找像素与其相邻像素之间颜色的快速变化来检测图片的边缘,在我们的例子中,该颜色是在白色或黄色车道线与黑色像素之间。

5:现在定义我们感兴趣的区域。 给定摄像机的位置和方向,我们知道车道将位于图像的下半部分,通常位于覆盖底角和中心的梯形中。 我们不希望我们的地区太狭窄,而我们感兴趣的地区不在界限之内。

6:我们运行Hough变换以检测图像上的线条。 霍夫变换做什么? 总而言之,它使我们能够轻松提取通过每个边缘点的所有线,并按相似性进行分组,从而将大致位于同一条线上的点组合在一起。 该算法总体而言很吸引人,我鼓励您在这里进行了解:Udacity计算机视觉简介。 您需要在Udacity上创建一个帐户,但是值得,相信我。

Hough变换使我们返回多行,但我们只希望我们的汽车在2条不同的车道之间行驶。 还有一些工作要做。
7:我们首先过滤具有水平斜率的线,以确保剩下的数据是干净的。
8:由于线的斜率,我们区分左右车道。
9.现在,我们按照车道线对点进行分组,我们计算了两组的线性回归,并在我们感兴趣的区域绘制了结果。 简而言之,线性回归是一种试图找到一组点之间的关系的尝试,因此基本上可以找到经过距每个点最近距离的直线。 此操作使我们可以在虚线行中填补空白。

美丽。
10:我们现在要做的就是将这些通道添加到我们的原始图像中。

如您所见,由于车道是弯曲的,并且我们的外推是线性的,因此我们无法完美匹配路缘。 但这只是介绍,我们暂时将其视为足够好;)。
11:由于我们将在视频上使用我们的算法,因此最后添加的调整是平滑处理。 我们始终考虑以前的车道,在绘制新车道之前给它们一个权重,以使运动更流畅并减少错误的影响。
这里有3个视频,显示最终输出。
下次,我们将讨论深度学习以及如何检测交通标志! 敬请关注。
感谢 Eric Sauvegrain 对这篇文章的反馈。