ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

[智能交通]step4:使用Python 3和OpenCV构建车道检测系统

2021-04-04 19:30:37  阅读:291  来源: 互联网

标签:车道 Python mask image cv2 像素 OpenCV step4 我们


前言

在找寻车道线检测的过程中发现了一篇好文章
但是需要科学上网,所有进行了转载
原博作者: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。敬请关注!

标签:车道,Python,mask,image,cv2,像素,OpenCV,step4,我们
来源: https://blog.csdn.net/Uni__Lee/article/details/115431563

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有