自动驾驶汽车的车道检测

简介: 自动驾驶汽车的车道检测

这篇文章是关于自动驾驶汽车车道检测的深度学习解决方案

即使在各种各样的条件下,人们也可以很容易地在道路上找到车道线。但是计算机并不容易。阴影,眩光,道路颜色的细微变化,线条的轻微障碍物……人们通常仍可以处理的所有事物,但计算机可能会遇到很大困难。

识别道路上的车道是所有人类驾驶员执行的一项常见任务,从而确保交通畅通并最大程度地减少与附近车道其他汽车相撞的机会。同样,自动驾驶汽车的执行也是至关重要的任务。事实证明,使用众所周知的计算机视觉技术可以识别道路上的车道标记。我们将介绍如何使用各种技术来识别和绘制车道内部,计算车道曲率,甚至估计车辆相对于车道中心的位置。

为了检测并绘制一个具有汽车当前所在车道形状的多边形,我们构建了一个由以下步骤组成的管道:

  • 从一组图像中计算摄像机校准矩阵和失真系数
  • 图像失真消除
  • 聚焦于车道线的颜色和渐变阈值
  • 通过透视变换产生鸟瞰图像
  • 使用滑动窗口来查找车道线像素
  • 拟合二阶多项式以识别组成车道的左右线
  • 车道曲率和偏离车道中心的计算
  • 图像上车道边界的变形和绘制以及车道曲率信息

640.png

相机校准和图像失真消除

当摄像机注视现实世界中的3D物体并将其转换为2D图像时,图像就会失真。这种转换并不总是完美的,变形会导致物体的外观尺寸,形状或位置发生变化。因此,我们需要纠正这种失真,以使摄像机能够准确看到图像。通过拍摄照相机的几张棋盘图像并使用cv2.calibrateCamera()函数来计算照相机校准矩阵,即可完成此操作。

为了计算摄像机的变换矩阵和失真系数,我们使用同一台摄像机在平面上的棋盘多张图片。OpenCV有一个称为findChessboardCorners的便捷方法,它将识别黑白方块相交的点,并以此方式对变形矩阵进行逆向工程。下图显示了在示例图像上找到的确定的棋盘角:

640.png

640.png

   

对原始图像进行失真校正

在步骤1中收集的摄像机校准数据可以应用于原始图像,以应用失真校正。图3显示了一个示例图像。可能难以看到应用失真校正的影响在原始图像与一个棋盘图像相比,但是如果你仔细看右边的图像进行比较,这种效应就更明显当你看白色的车已经稍微裁剪以及树木失真校正时应用。

640.png

对示例图像进行不失真处理之前和之后的结果

使用颜色变换,渐变等来创建带阈值的二进制图像。

该步骤背后的想法是创建一个图像处理管道,其中算法可以清楚地识别车道线。通过使用不同的渐变,阈值和色彩空间,有多种不同的解决方案。我在几幅不同的图像上尝试了许多这些技术,并使用了阈值,色彩空间和渐变的组合。我选择了以下组合来创建图像处理管道:HLS颜色空间中的S通道阈值和HSV颜色空间中的V通道阈值,以及用于检测车道线的渐变。最终的二进制阈值图像的示例如图4所示,其中车道线清晰可见。

640.png

应用渐变和阈值生成二进制阈值图像之前和之后的结果

应用透视变换以生成图像的“鸟瞰图”。

图像具有透视图,即使它们彼此平行,也可以使图像中的车道线看起来像是在一定距离处会聚。移除此透视图后,更容易检测车道线的曲率。这可以通过将图像转换为2D鸟瞰图来实现,其中车道线始终彼此平行。由于我们只对车道线感兴趣,因此我在原始未失真图像上选择了四个点,并将透视图转换为鸟瞰图,如下图5所示。

640.png

兴趣区域视角扭曲生成鸟瞰图

检测车道像素并拟合找到车道边界。

要检测车道线,有许多不同的方法。我使用的卷积是两个单独的信号的乘积:窗口模板和像素图像的垂直切片。我使用滑动窗口的方法来应用卷积,这将使每个窗口的热点像素的数量最大化。窗口模板从左到右滑过图像,任何重叠的值求和,创建卷积信号。卷积信号的峰值是像素重叠最高的位置,是车道标记器最可能的位置。方法已被用于识别车道线像素在矫正二值图像。已识别出左右线,并与曲线多项式函数拟合。用滑动窗口方法和多项式拟合重叠识别的线像素的示例图像如图6所示。

640.png

滑动窗口拟合结果

确定车道的曲率和车辆相对于汽车中心的位置。

我对车道线的位置进行了测量,并估计了道路弯曲的程度,以及车辆相对于车道中心的位置。我假设相机安装在汽车的中心。

将检测到的车道边界扭曲到原始图像上,并显示车道曲率和车辆位置的数值估计。

从校正图像的拟合已经被扭曲回到原始图像,并绘制识别车道边界。图7显示了正确识别的车道边界,并扭曲回到原始图像。图8显示了带有车道、曲率和从中心开始的位置的示例图像。

640.png

640.png

检测到的车道线与原图像以及曲率半径和汽车的位置重叠

最终结果

640.png

目录
相关文章
|
监控 数据处理 索引
使用Python批量实现文件夹下所有Excel文件的第二张表合并
使用Python和pandas批量合并文件夹中所有Excel文件的第二张表,通过os库遍历文件,pandas的read_excel读取表,concat函数合并数据。主要步骤包括:1) 遍历获取Excel文件,2) 读取第二张表,3) 合并所有表格,最后将结果保存为新的Excel文件。注意文件路径、表格结构一致性及异常处理。可扩展为动态指定合并表、优化性能、日志记录等功能。适合数据处理初学者提升自动化处理技能。
587 1
|
JavaScript
Qt视频播放器[QMediaPlayer+QVideowidget]
本代码在Window10下运行,利用qMediaPlayer和qvideowidget实现视频文件mp4的播放,并且提供进度显示,还可以通过拖动进度条来变换播放位置
1660 0
|
前端开发 搜索推荐 定位技术
GIS前端—地图标注
GIS前端—地图标注
528 1
|
JavaScript 前端开发
用JavaScript正则表达式匹配对应字符串高亮显示,并过滤掉空格、<、>等HTML节点符号
用JavaScript正则表达式匹配对应字符串高亮显示,并过滤掉空格、<、>等HTML节点符号
|
存储 JSON 前端开发
jwt超详细配置和教程
jwt超详细配置和教程
552 2
|
机器学习/深度学习 人工智能 自然语言处理
AIGC-基于EAS服务快速部署一个AI视频生成
AIGC-基于EAS服务快速部署一个AI视频生成
|
安全 Java Apache
使用BeanUtils进行属性拷贝
使用BeanUtils进行属性拷贝
|
测试技术 Apache 数据安全/隐私保护
使用 Apache JMeter 事务控制器的详细指南
Apache JMeter 的事务控制器用于组合多个请求成一个事务,以便衡量整体性能。创建测试计划涉及添加线程组、事务控制器和采样器,配置参数如线程数、Ramp-Up时间和循环次数。在事务控制器内,添加HTTP请求模拟用户登录和访问主页等操作。通过勾选选项,包括计时器和处理器时间。添加监听器如汇总报告和查看结果树来分析结果,从而评估系统性能瓶颈。事务控制器对于测试复杂业务流程的性能非常有用。
|
Web App开发 应用服务中间件 nginx