大约十年前,还在对原型进行实验。立刻被这个想法吸引住了。诚然,不得不等待一段时间,直到这些概念对社区开源,但等待是值得的!
最近,尝试了一些与计算机视觉相关的自动驾驶汽车概念,包括车道检测。想一想——这实际上是设计任何自动驾驶车辆的一个核心概念。
以下是将在本视频中构建的车道检测系统的概览:
非常酷,对吧?迫不及待地想要开始,并引导踏上这次受计算机视觉启发的车道检测和自动驾驶汽车之旅,使用OpenCV库。当然也会在这个教程中经历Python代码。
对于任何深度学习或计算机视觉新手——如果想要开始,可以查看以下资源。这些资源是开始计算机视觉之旅的好地方:
那么什么是车道检测呢?以下是维基百科对车道的定义:
“车道是道路(车行道)的一部分,被指定由单行车辆使用,以控制和引导驾驶员,减少交通冲突。” ——
将其正式定义非常重要,因为它使能够继续进行车道检测概念。在构建系统时不能有任何歧义,对吧?
正如之前提到的,车道检测是自动驾驶汽车和自动驾驶车辆的关键组成部分。它是驾驶场景理解中最重要的研究课题之一。一旦获得车道位置,车辆将知道去哪里,并避免进入其他车道或偏离道路的风险。这可以防止驾驶员/汽车系统偏离驾驶车道。
以下是一些随机道路图像(第一行)以及它们的检测车道(第二行):
希望执行的任务是视频中的实时车道检测。可以通过多种方式执行车道检测。可以使用基于学习的方法,例如在注释过的视频数据集上训练深度学习模型,或者使用预训练的模型。
然而,也有更简单的方法来执行车道检测。在本文中,将向展示如何在不使用任何深度学习模型的情况下进行车道检测。但将使用流行的Python中的OpenCV库。
以下是一个将要处理的视频帧的示例:
正如在这幅图像中看到的,有四个由白色车道标记分隔的车道。因此,要检测一个车道,必须检测该车道两侧的白色标记。这引出了一个关键问题——如何检测车道标记?
除了车道标记之外,场景中还有很多其他物体。路上有车辆,路边有障碍物,路灯等。在视频中,每个画面的场景都会变化。这很好地反映了现实生活中的驾驶情况。
因此,在解决车道检测问题之前,必须找到一种方法来忽略驾驶场景中的不需要的物体。
可以立即做的一件事就是缩小感兴趣区域的范围。
不是处理整个画面,而是只处理画面的一部分。
在下面的图像中,除了车道标记之外,画面中的所有其他东西都被隐藏了。随着车辆的移动,车道标记将或多或少地落在这个区域内:
在这里,一个帧掩码只不过是一个NumPy数组。当想要对图像应用掩码时,只需将图像中所需区域的像素值更改为0、255或任何其他数字。以下是一个图像掩码的例子。图像中某个区域的像素值已被设置为0:
这是一种非常简单但有效的方法,用于从图像中移除不需要的区域和物体。
首先将掩码应用于输入视频中的所有帧。然后,将应用图像阈值处理,然后是霍夫线变换来检测车道标记。
在这种方法中,灰度图像的像素值根据阈值被分配为代表黑色和白色的两个值之一。因此,如果像素的值大于阈值,则被分配一个值,否则被分配另一个值。
如上所述,在对掩码图像应用阈值处理后,在输出图像中只得到车道标记。现在可以很容易地使用霍夫线变换来检测这些标记。
霍夫变换是一种可以检测可以用数学表示的任何形状的技术。例如,它可以检测矩形、圆形、三角形或线条等形状。对检测可以表示为线条的车道标记感兴趣。强烈建议查看霍夫变换的。
在执行图像阈值处理后对图像应用霍夫线变换将给以下输出:
是时候在Python中实现这个车道检测项目了!建议使用Google Colab,因为构建车道检测系统将需要计算能力。
让首先导入所需的库:
# 导入必要的包
import os
import re
import cv2
import numpy as np
from tqdm import tqdm_notebook
import matplotlib.pyplot as plt
从这个YouTube视频中采样了一些视频帧。可以从这个下载帧。
# 绘制其中一个帧
感兴趣区域是多边形形状。想要掩码这个区域之外的所有内容。因此,首先必须指定多边形的坐标,然后使用它来准备帧掩码:
# 指定多边形的坐标
必须对视频帧执行几个图像预处理操作以检测所需的车道。预处理操作是:
# 1. 图像阈值处理
# 2. 霍夫线变换
现在将对每一帧应用所有这些操作。还将保存结果帧到一个新的目录:
# 应用操作并保存结果帧
# 获取所有检测到车道的帧
# 将帧组合成视频