阐述了基于OpenCV的传统图像处理算法在车道线检测技术中的应用。
本节将使用传统图像处理算法检测车道线,然后根据车道线方向逐帧调整小车运行状态。这个过程涉及两个方面:感知和动作规划。感知部分主要通过车道线检测来实现,动作规划则通过操控转向角度来实现。车道线检测的目的就是希望能够根据检测到的车道线位置来计算最终应该转向的角度,从而控制小车始终行驶在当前车道线内。
由于道路环境比较简单,可以进一步简化控制变量。对于油门值,可以在运行时保持低匀速,这样只需要控制转向角度即可,实现起来更加容易。这种模式类似于现实生活中在驾驶汽车时开启了定速巡航功能。
下面针对模拟环境采集到的图像,进行算法分析。
01、基于HSV空间的特定颜色区域提取
从仿真平台捕获的图像上进行分析,小车左侧是黄实线,右侧是白实线。最终目标是希望小车一直运行在这两条车道线中间。因此,首先要提取出这两条线才能定性分析出它们的斜率,从而为小车转向角度提供依据。具体的,可以通过颜色空间变换来提取车道线区域。为了方便将黄色线和白色线从图像中提取出来,可以将图像从RGB空间转换到HSV空间再处理。这里首先解释下RGB和HSV颜色空间的区别。
RGB是平时接触最多的颜色空间,由三个通道表示一幅图像,分别为红色(R)、绿色(G)和蓝色(B)。RGB颜色空间是图像处理中最基本、最常用的颜色空间,其利用三个颜色分量的线性组合来表示颜色,任何颜色都与这三个分量有关,但是这三个分量是高度相关的,想对图像的颜色进行调整需要同时更改这三个分量才行。在图像处理领域,针对特定颜色提取问题,使用较多的是HSV颜色空间,它比RGB空间更接近人类对色彩的感知经验,可以非常直观地表达色彩的色调、鲜艳程度和明暗程度,方便进行颜色的对比。
HSV表达彩色图像的方式由三个部分组成:色调(Hue)、饱和度(Saturation)、明度(Value)。其中色调用角度度量表示,取值范围为0~360,不同角度代表不同的色彩信息,即所处的光谱颜色的位置。
如果想要提取出黄色线,可以将色调范围控制在30~90。注意,在OpenCV中色调取值范围是[0~180],因此上述黄色范围需要缩小1倍,即[15~45]。检测白色车道线也是采用类似的原理。读者可以自行查找色调表来找到特定颜色的色调范围。
具体实现代码如下(opencv_drive/img_analysis.py):
import cv2
import numpy as np
import math
#----------------------1.基于HSV空间的特定颜色区域提取------------------
# 读取图像并转换到HSV空间
frame = cv2.imread('test.jpg')
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# 黄色线检测
lower_blue = np.array([15, 40, 40])
upper_blue = np.array([45, 255, 255])
yellow_mask = cv2.inRange(hsv, lower_blue, upper_blue)
cv2.imwrite('yellow_mask.jpg', yellow_mask)
# 白色线检测
lower_blue = np.array([0, 0, 200])
upper_blue = np.array([180, 30, 255])
white_mask = cv2.inRange(hsv, lower_blue, upper_blue)
# 保存中间结果
cv2.imwrite('yellow_mask.jpg', yellow_mask)
cv2.imwrite('white_mask.jpg', white_mask)
上述代码首先将图像从BGR空间转换到了HSV空间,然后使用cv2.inRange()函数提取特定颜色范围内的图像区域。
特定颜色区域提取效果如图1.37所示。

02、基于高斯模糊的噪声滤除
观察前面的颜色区域提取效果,会发现有不少的离散噪声点,这些噪声会对后面的计算造成干扰,因此可以先提前用滤波算法处理一下。这里可以使用1.3节中介绍过的高斯模糊来消除这些高频噪声,具体可以通过OpenCV提供的现成的高斯模糊函数cv2.GaussianBlur()来实现。