无人驾驶项目实战:使用OpenCV进行实时车道检测

作者:PRATEEK JOSHI
翻译:张若楠
校对:吴金笛
本文长度为2600字,建议阅读10分钟
本文为一个从图像预处理角度入手的无人驾驶车道识别实战项目 。
作者序
大约十年前,我瞥见了第一辆自动驾驶汽车,当时google仍在对初代无人车进行测试,而我立刻被这个想法吸引了 。诚然,在将这些概念开源给社区之前,我必须等待一段时间,但是这些等待是值得的 。
我最近尝试了一些与计算机视觉有关的自动驾驶理念,其中包括车道检测 。设想一下,在设计任何自动驾驶汽车时,车道检测都是一个非常核心的技术 。我们将基于这段视频搭建车道检测系统:https://youtu.be/sYhZbhT-Smw 。很酷对吧?我将使用OpenCV库,通过计算机视觉,引导你进入车道检测和自动驾驶这一领域 。当然,在本教程中我们还将讲解Python代码 。
对于任何深度学习或计算机视觉新手,请注意--如果你要入门,请查看以下课程及产品 。这些资源可以很好的助力你开始计算机视觉之旅:

  • 深度学习基础
https://courses.analyticsvidhya.com/courses/fundamentals-of-deep-learning
  • 使用深度学习的计算机视觉
https://courses.analyticsvidhya.com/courses/computer-vision-using-deep-learning-version2
目录1. 了解车道检测的概念
2. 问题陈述
3. 什么是帧蒙版(Frame Mask)?
4. 用于车道检测的图像预处理
5. 在Python中使用OpenCV进行车道检测实战
车道检测的概念那么什么是车道检测?维基百科是这样定义车道的:“车道是道路(行车道)的一部分,专门用于单行车辆,以控制和引导驾驶员并减少交通冲突 。”
无人驾驶项目实战:使用OpenCV进行实时车道检测

文章插图
 
Figure 1:https://en.wikipedia.org/wiki/Lane
对此进行正式定义很重要,因为它使我们能够在项目中使用固定的车道定义,这样在构建系统时我们不会产生任何歧义 。
如我之前提到的,车道检测是自动驾驶的重要组成部分 。它是推动场景理解的最重要的研究主题之一 。一旦获得车道位置,车辆将知道要去哪里,并避免驶入其他车道或离开道路的风险 。这可以防止驾驶员/驾驶系统偏离行车轨道 。
以下是一些随机道路图像(第一行)及其检测到的车道(第二行):
无人驾驶项目实战:使用OpenCV进行实时车道检测

文章插图
 
Figure 2 https://github.com/qinnzou/Robust-Lane-Detection
问题陈述我们希望执行的任务是视频中的实时车道检测 。我们可以通过多种方式做车道检测 。可以使用样本训练的方法,例如在带有标注的视频数据集上训练深度学习模型,或者使用预先训练好的模型 。
但是,也有更简单的方法来执行车道检测 。在本文中,我将向你展示如何在不使用任何深度学习模型的情况下做到这一点 。我们将在Python中用到广受欢迎的OpenCV库 。
以下是我们将要处理的视频中的一帧:
无人驾驶项目实战:使用OpenCV进行实时车道检测

文章插图
 
如图片中所示,我们有四条用白色车道标记隔开的车道 。因此要检测一条车道,我们必须检测到该车道两侧的白色标记 。这就引出了关键问题 -- 我们如何检测车道标记线?
除了车道线外,场景中还有很多其他对象 。道路上有车辆,路旁的障碍物,路灯等 。在视频中,每一帧的场景都在变化 。这很好地反映了现实生活中的驾驶情况 。因此,在解决车道检测问题之前,我们必须找到一种方法来忽略驾驶场景中的无关物体 。我们可以直接上手的一件事就是缩小关注范围 。相较于使用整个帧,我们只使用画面中的一部分 。在下图中,除车道标记外,其他所有内容都隐藏在该帧中 。随着车辆的移动,车道标记只会在该区域出现得更多或更少 。
无人驾驶项目实战:使用OpenCV进行实时车道检测

文章插图
 
在下一节,我将向你展示如何编辑视频的边框以选择特定区域 。此外你还将了解一些必要的图像预处理操作 。
什么是蒙版(Frame Mask)?在这里,蒙版不过是一个NumPy数组 。当我们想对图像应用遮罩时,我们只需将图像中所需区域的像素值更改为0或255,或任何其他数字 。下面给出的是图像遮罩的示例 。图像中某个区域的像素值已设置为0:
无人驾驶项目实战:使用OpenCV进行实时车道检测

文章插图
 
这是一种非常简单但有效的方法,可以从图像中删除不需要的区域和对象 。


推荐阅读