首页 > 编程学习 > [智能交通]step4:使用Python 3和OpenCV构建车道检测系统

前言

在找寻车道线检测的过程中发现了一篇好文章
但是需要科学上网,所有进行了转载
原博作者:Galen Ballew,原博链接

正文

我在12月份开始了Udacity自驾车工程师Nanodegree。目前,我正在完成我的第二个项目,该项目使用卷积神经网络对交通标志进行分类,该卷积神经网络采用了经过改进的LeNet架构。如果您有兴趣,可以在此处查看我关于它的帖子。我想回到我的第一个项目,使用OpenCV检测车道线,并向可能对基本计算机视觉感兴趣的人展示它的工作原理和外观。首先,这是一个很棒的项目,最初是计算机视觉领域的新手。我学到了很多东西,最终建立了一个行之有效的管道。您可以在GitHub上找到代码。我强烈建议您亲自尝试该代码-您甚至可以在您的视频中运行它!

挑战:

开车时,我们会用眼睛来决定要去的地方。道路上的线条向我们显示了车道的位置,这是我们始终指引车辆驶向何处的参考。自然,在开发自动驾驶汽车时,我们要做的第一件事就是使用算法自动检测车道线。
我们想从这样的图像开始:
原始图像
处理图像以进行车道检测,得到从霍夫空间转换绘制的线:
从霍夫空间转换绘制的线
最后,对这些行进行外推并取平均值,以实现平滑车道检测功能,我们可以将其应用于视频帧,得到最终影像:
最终影像

方法:

使用我们的图像的第一步将是将它们转换为灰度。这是在OpenCV中使用Canny Edge Detector的关键步骤。我将在稍后讨论更多有关canny()功能的信息,但现在重要的是要意识到我们正在将3个像素值通道(红色,绿色和蓝色)折叠为一个像素值范围为[0,255]的单个通道。

gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

BGR到灰度转换得到的图像:
BGR到灰度转换
在检测到边缘之前,我们需要准确地弄清楚我们要寻找的内容。车道线始终是黄色和白色。黄色可能是在RGB空间中隔离的棘手颜色,因此让我们将其转换为Hue Value Saturation或HSV颜色空间。您可以通过Google search找到黄色值的目标范围。我使用的是下面。接下来,我们将对原始RGB应用遮罩image以返回我们感兴趣的像素。

lower_yellow = np.array([20,100,100],dtype =“ uint8”)
upper_yellow = np.array([30,255,255],dtype =“ uint8”)
mask_yellow = cv2.inRange(img_hsv,lower_yellow,upper_yellow)
mask_white = cv2.inRange(gray_image,
200,255 )mask_yw = cv2.bitwise_or(mask_white,mask_yellow)
mask_yw_image = cv2.bitwise_and(g

所有非黄色或白色像素的灰度图像设置为黑色/零得到的图像:
在这里插入图片描述
自原始图像以来,我们当然已经做了很多工作,但是魔术尚未发生。让我们应用快速的高斯模糊。该滤镜将通过平均邻域中的像素值来帮助抑制Canny Edge Detection中的噪声。

kernel_size = 5
gauss_gray = gaussian_blur(mask_yw_image,kernel_size)

Canny Edge Detection

我们准备好了!让我们计算一下Canny Edge Detection。快速学习微积分将真正帮助您准确了解这里发生的事情!基本上,canny()根据像素值的方向导数(即梯度)来解析像素值。剩下的就是边缘-或至少在一个方向上存在陡峭导数的地方。在canny()计算梯度时,我们将需要提供阈值。约翰坎尼(John Canny)本人建议将门槛比率从1:2或1:3降低到高。

low_threshold = 50
high_threshold = 150
canny_edges = canny(gauss_gray,low_threshold,high_threshold)

在这里插入图片描述
我们已经走了很长一段路,但我们还没有到那儿。我们不希望我们的汽车在地平线上,甚至在另一条车道上都注意任何事情。我们的车道检测管线应集中在汽车前方。这样做,我们将创建另一个称为“感兴趣区域(ROI)”的蒙版。ROI以外的所有内容都将设置为黑色/零,因此我们仅处理相关的边缘。我将为您提供有关如何制作此多边形的详细信息-在GitHub存储库中查看以了解我的实现。

roi_image = region_of_interest(canny_edges, vertices)

The ROI for lane detection:在这里插入图片描述

霍夫空间

准备振作起来。您最喜欢的等式y = mx + b即将揭示其变化的自我-霍夫变换。Udacity提供了有关Hough空间的一些惊人的视频内容,但目前仅面向学生。但是,这是一篇出色的论文,可让您熟悉该主题。如果您不喜欢学术研究出版物,请不要担心。最大的收获是,在XY空间中,线是线,而点是点,但是在霍夫空间中,线对应于XY空间中的点,而点对应于XY空间中的线。这是我们的程序的样子:

  1. 像素被视为XY空间中的点
  2. hough_lines() 将这些点转换为霍夫空间内的线
  3. 这些线相交的任何地方,霍夫空间中都有一个相交点
  4. 相交点对应于XY空间中的线

如果您对这部分的代码感兴趣,请确保遵循repo中的Jupyter笔记本。您可以在此处找到有关Hough变换的参数的更多信息。不要害怕尝试并尝试不同的阈值!让我们看看它的实际效果:
在这里插入图片描述

关于上图的主要观察结果是,该图包含来自我们处理以创建它的任何照片的零像素数据。它是严格的黑色/零和绘制的线条。而且,看起来只有两行的实际上可能是多种多样的。在霍夫空间中,可能有很多很多交点表示XY中的线。我们将所有这些线合并为两个主要平均值。我构建用于遍历行的解决方案在代码中。

有了两条主线后,我们就可以将线图像与道路的原始,未改变的图像进行平均,以得到美观,平滑的叠加层。

complete = cv2.addWeighted(initial_img, alpha, line_image, beta, lambda)

在这里插入图片描述

处理影片

编辑一帧,创建滚动平均值并处理30FPS只需几行。

结果:

这是对Udacity SDC工程师纳米学位的精彩介绍。通过这个项目并建立解决方案,我感到很开心。就是说,我有几件事需要改进。
感兴趣的车道检测区域(ROI)必须是灵活的。当沿着陡峭的斜坡向上或向下行驶时,地平线将发生变化,不再是框架比例的乘积。对于急转弯和大通车,这也是要考虑的问题。
晚上开车。颜色识别和选择过程在白天非常有效。引入阴影会产生一些噪音,但不会提供像夜间驾驶或在能见度有限的条件下(例如大雾天)开车那样严格的测试
同时,我将建立一个卷积神经网络对交通标志进行分类,进一步了解TensorFlow,并熟悉Keras。敬请关注!


本文链接:https://www.ngui.cc/el/414505.html
Copyright © 2010-2022 ngui.cc 版权所有 |关于我们| 联系方式| 豫B2-20100000