自动驾驶汽车的车道检测

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

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

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

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

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

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

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

目录
相关文章
|
人工智能 算法 前端开发
我和通义灵码的一周年
通义灵码是阿里巴巴推出的一款AI插件,大小约5.8M,适用于IDEA开发环境。它通过@workspace和@terminal两大功能,显著提升代码开发效率和质量。@workspace帮助开发者快速理解项目结构,智能导航至关键代码;@terminal则提供命令行下的代码搜索与实时补全,加速开发流程。实际应用中,通义灵码大幅缩短了新项目熟悉时间,减少了试错成本,提升了代码的规范性和稳定性。
482 0
|
JavaScript
Qt视频播放器[QMediaPlayer+QVideowidget]
本代码在Window10下运行,利用qMediaPlayer和qvideowidget实现视频文件mp4的播放,并且提供进度显示,还可以通过拖动进度条来变换播放位置
1725 0
|
设计模式 存储 人工智能
深度解析Unity游戏开发:从零构建可扩展与可维护的游戏架构,让你的游戏项目在模块化设计、脚本对象运用及状态模式处理中焕发新生,实现高效迭代与团队协作的完美平衡之路
【9月更文挑战第1天】游戏开发中的架构设计是项目成功的关键。良好的架构能提升开发效率并确保项目的长期可维护性和可扩展性。在使用Unity引擎时,合理的架构尤为重要。本文探讨了如何在Unity中实现可扩展且易维护的游戏架构,包括模块化设计、使用脚本对象管理数据、应用设计模式(如状态模式)及采用MVC/MVVM架构模式。通过这些方法,可以显著提高开发效率和游戏质量。例如,模块化设计将游戏拆分为独立模块。
1077 3
|
存储 JSON 前端开发
jwt超详细配置和教程
jwt超详细配置和教程
590 2
|
安全 Java Apache
使用BeanUtils进行属性拷贝
使用BeanUtils进行属性拷贝
|
Web App开发 应用服务中间件 nginx
|
图形学
Unity用脚本创建物体
Unity用脚本创建物体
360 0
|
存储 数据处理 索引
Pandas读取Excel文件内容的方法使用正确的指南
Pandas读取Excel文件内容的方法使用正确的指南