贾文洋 王鹏举 吴文祥 刘朋
关键词 计算机视觉 车道识别 驾驶状态监测
1引言
近年来,随着社会经济的不断发展,人们生活水平不断提高,越来越多的家庭拥有了汽车。自动驾驶技术的不断发展,使得越来越多的汽车开始装备驾驶辅助系统。
采用计算机视觉进行道路识别和驾驶辅助具有成本低、部署快速、效率高等特点。使用OpenCV 对摄像头传回的数据进行实时处理。使用Canny 边缘检测技术和霍夫变换以实现图像的实时处理,Canny 边缘检测采用了高斯模糊来加强对数据处理的精准性,首先进行图像的降噪,然后计算图像梯度,随后进行非极大值抑制和阈值筛选,使用霍夫(Hough)变换寻找直线,最后标记出道路供驾驶员参考或为自动驾驶设置界限。
在OpenCV 的基础上,引入Tensorflow API 和已训练数据集进行目标识别[1] 。根据已经训练好的模型,在车辆行驶中进行目标识别,如行人、车辆、红绿灯等。同时,针对已有系统无法对驾驶员进行监控和驾驶辅助问题,我们采用车载双摄像头的方式对车外道路信息和车内驾驶员驾驶状态进行实时采集来解决。车外摄像头采集图像,使用OpenCV 进行实时的图像处理,识别车道并帮助驾驶员进行行车路线的保持;车内摄像头通过对驾驶者一定时间内的眨眼次数进行统计,以判断驾驶员的驾驶状态。
2车道识别步骤及算法实现
车道线检测和识别模块主要流程如图1 所示。
2.1ROI 区域划分算法实现
收集实时图像时,图像中会出现对数据处理结果产生干扰的区域,如路边的电线杆、大石块等。这些因素的出现会导致数据处理速度变慢甚至影响准确性。为了排除非必要数据所带来的干扰,通过图像ROI 来解决这个问题。ROI 通过在图像上选择或使用诸如设定阈值以及从其他文件转换获得等方法生成。ROI 区域可以是点、线、面、不规则的形状,通常用来作为图像分类的样本、掩膜、裁剪区。根据实际情况和模拟场景所提取到的数据来看,车道线的信息一般位于图像中间靠下部分,因此需要对图像进行裁剪,从而减少计算时间、提高检测精度[2] 。
2.2图像灰度处理算法实现
为了减小后续图像处理的计算量,提高系统的实时性能,需要将车外摄像头采集到的实时彩色图像转变成灰度图像(图2)。灰度图像将反映圖像局部和全体的色度与亮度阶度的分布特征,并且灰度图像消耗的内存空间小。
2.3Canny 边缘检测算法实现
可以在精准提取图像边缘的前提下,尽可能降低噪声所产生的影响,并且将图像中弱边缘和强边缘识别出来。对于路面磨损、不清晰等情况,Canny边缘检测的鲁棒性强,能够综合强弱边缘的位置关系,计算出图像整体边缘信息。Canny 边缘检测算法如下。
使用高斯模糊对图像进行处理,保留边缘信息,使用3×3 高斯滤波器:
采取非极大值抑制,比较图像像素和梯度强度与正负两个方向上的两个像素,若当前像素梯度强度大于其他两个梯度时,设置该点为边缘点,反之则该点将会被抑制。
检测强边缘和弱边缘。设置两个值为阈值。将检测到的边缘点梯度值与双阈值进行比较。若边缘点梯度值大于较小阈值且小于较大阈值,则该点为弱边缘;若该点梯度值小于小阈值,则删除该点。
在进行灰度处理后,系统将采用高斯滤波对图像在传输过程中因为各种因素所干扰而产生的噪声干扰进行去除。通过高斯函数离散化处理,以离散点的高斯函数值为权重对图像灰度矩阵的每个像素进行加权平均,最后输出结果(图3)。
2.4霍夫变换对直线进行检测算法实现
为了在车道检测的过程中将区域中的直线绘制出来(图4),实现ROI 区域像素从笛卡尔x?y 坐标系到霍夫k?b 坐标系的转换,使用了概率霍夫变换,其算法如下:(1)检测直线上的所有像素点,找到符合y=kx+b 的所有点坐标(x,y);(2)将y=kx+b 转换为b=-kx+y 的形式。y=kx+b 直线上的点在b=-kx+y 上都体现出经过(k,b)点,将这些点转换为直线;(3)图像中所有b=-kx+y 的点都表示各种直线。若找到了直线的交点,那么就找到了y=kx+b 坐标中的直线。
2.5图像实时回传的处理方法
使用OpenCV 获取实时画面,并将画面以窗口化方式呈现在车载电脑屏幕上。对实时屏幕画面进行典型处理,对传回的图像进行灰度处理和canny 边缘检测,最终可以达到每秒20 帧左右的画面实时处理速度。如图5 所示。
2.6提高边缘检测下直线精度的处理方法
将传回的图像直接进行边缘检测处理时,存在识别线条精度问题:一些线条出现短线、断层,这对车道的精准识别产生影响。传回边缘检测所产生的线条时,以坐标形式进行函数划分,在断层处画线连接,使用高斯模糊对图像进行边缘化处理。
3使用Tensorflow API 中的部分方法实现目标识别和碰撞预警
使用OpenCV 的目标识别函数进行动态物体的识别,会导致识别效率低下[3] 。为了更好的解决上述问题,选择使用Tensorflow API 与已经训练好的模型相结合,进行实时识别并标注车辆、行人、红绿灯位置,还可以进行距离碰撞预警(图6)。主要方法如下。
4驾驶员驾驶状态识别及算法实现
驾驶员驾驶状态识别模块主要流程如图7 所示。
4.1使用OpenCV 进行人脸识别的算法实现
通过OpenCV 调用摄像头,使用基于dlib 的68 个特征点检测模型进行人脸识别、眼间距以及眨眼次数的统计。主要算法如下。
4.2Yolov5 进行物品识别的算法实现
在前期进行模型的训练,使系统具有识别手机、水杯的功能,并进行系统自动标注( 图8)。使用yoloV5 python 接口(detect.py)处理图片并创建Flask服务,主要算法如下。
4.3驾驶员驾驶疲劳判断的算法实现
检测驾驶员的瞳孔直径,计算注目凝视、眼球转动、眉眼扫视、眼睛闭合的时长,确定驾驶员疲劳的程度。根据Perclos 算法检测出驾驶员存在疲劳驾驶状态,系统就会发出预警信号。主要算法如下。
5总结
本文通过基于OpenCV 实现了摄像头的视频流处理,识别出当前道路直线情况。同时,调用TensorflowAPI 实现了行车障碍的识别和碰撞距离的预警;对于车内驾驶员,通过OpenCV 和Yolov5 实现了对驾驶员驾驶状态的检测和特定物品识别,将大大增加驾驶安全性。本系统尚有不足之处,如对道路识别的准确性、对特定物品识别的速度和精准度等都有待提高,未来将逐渐完善此项工作,不断提高系统的稳定性和鲁棒性。