董玉霞,苏荣聪
(泉州信息工程学院 软件学院,福建 泉州 352000)
随着社会的不断进步和经济的繁荣发展,汽车已经成为人们重要的交通工具,逐渐成为家庭的必需品[1].汽车在给人们提供便利出行条件的同时,也面临着交通安全问题,汽车交通事故给人们的生命安全和财产安全造成了巨大威胁.疲劳驾驶是常见的汽车安全事故发生的起因,汽车驾驶员由于长时间驾车行驶导致心理和生理到达了极限,造成机能失调从而导致操作技能下降等问题,最终导致交通事故的发生[2].在汽车驾驶的过程中,驾驶员长期独自处于封闭的环境,容易产生疲惫心理,机械式的操作让驾驶员容易感觉发困,在注意力分散的情况下,容易造成操控机能减弱,使汽车偏移正常轨道,非常容易导致交通事故的发生[3].但是疲劳驾驶不同于酒驾和超速驾驶,疲劳驾驶不容易被发现,最终导致惨剧的发生,成为当今道路交通安全的一个重大的交通隐患.
徐柱等[4]为了提高汽车在交通道路行驶的安全性,提出了一种基于人眼开度特征的汽车疲劳驾驶检测系统,首先基于数据挖掘技术对汽车驾驶员的人脸特征和人眼特征进行定位和采集,根据驾驶员行驶过程中的动态拉伸人眼开度特征,获取人眼周围的像素特征点,实现对汽车驾驶员人眼开度特征的采集,并通过行驶过程中驾驶员的人眼开度特征与标准的人眼开度信息进行对比,通过驾驶员的眨眼频率确定驾驶员的驾驶状态,对于疲劳驾驶的人员进行及时预警,实验结果表明了该方法的实用性,但是无法准确检测出疲劳驾驶的人员.李照等[5]针对汽车疲劳驾驶问题,提出了一种基于数字处理信号DSP的疲劳驾驶检测系统,该系统通过搭载TMS320红外光源,结合处理模型对驾驶员的疲劳程度进行实时检测,并根据数据挖掘技术对采集的驾驶员录像进行甄别,利用浮点代码对不满足驾驶标准的驾驶图像预警,经过大量反复实验,验证了该系统可以在任何环境下采集驾驶员的驾驶状态,但是实时性较差,无法广泛应用于汽车驾驶过程中.
基于以上研究背景,本文利用OpenCV编程函数库,设计了驾驶员实时疲劳检测系统,从而提高系统的功能和性能.
实时疲劳检测系统主要是通过传感器对驾驶员状态进行采集,并利用固定的参数对处理器进行运算处理[6],最后通过计算结果判断驾驶员是否疲劳驾驶.用搭载语音驱动模块和驾驶员进行实时互动,对疲劳驾驶人员进行预警信息提示,实现对驾驶员实时疲劳检测.实时疲劳检测系统的硬件结构如下图1所示.
图1 实时疲劳检测系统的硬件架构图
实时疲劳检测系统硬件架构中的核心处理器,由主控电路STM34H723构成,并通过摄像头OV12544进行驾驶员状态采集,核心处理电路采用64位的ADM内核对驾驶员驾驶图像进行处理.将薄膜压力传感器附着在方向盘上,实时对驾驶员的握力进行检测,再根据相关软件进行计算,并通过测量汽车的百公里速度判断是否存在疲劳驾驶状态.
实时疲劳检测系统的对外通信模块主要采用NB-LOT模块,通过该模块与硬件电路的连接实现驾驶员实时驾驶状态信息的远端同步,有利于及时进行数据处理.
实时疲劳检测系统的语音交互主要通过集成电路实现的.LD3325电路与主电路相连实现驾驶员语音提醒工程,并通过识别模块对语音信号进行及时处理,从而确定驾驶员是否接收到相关信息.
图像传感器的选择在实时疲劳检测系统中是非常重要的环节,因为图像传感器的分辨率直接影响实时疲劳检测系统的最终结果[7],经过多种考虑,本文选择PO3030K图像传感器作为系统的图像传感器,其引脚功能如表1所示.
表1 PO3030K图像传感器的引脚功能
PO3030K图像传感器的结构如图2所示,该图像传感器主要由1080×1080的像素列阵构成,用于驾驶员驾驶过程中面部图像的采集.PO3030K图像传感器的引脚功能主要用于复位电位[8],减少噪音对实时疲劳检测系统准确度的影响,然后通过固定采集信号,在不同光线条件下对驾驶员的状态进行采集.
图2 图像传感器的结构图
PO3030K图像传感器的主要功能是通过编程实现的,通过I2C与总线接口相连,即可实现对于寄存器的修改.I2C总线是构成图像传感器的核心部分,主要用于数据的分析与处理[9],可以处理摄像头拍摄的驾驶员面部表情,并对采集的图像进行处理,将结果分配到相关的电路模块上.在信息传输过程中,I2C总线上的每一块传感器模块都是接收器,并通过控制电路实现对控制量类别和大小的调整.
驾驶员实时疲劳检测系统的摄像头电路如图3所示.
图3 摄像头接口电路图
摄像头电路设计的过程中芯片主要采用SCCB接片设计原理,利用八位的电源接口将FIFO的各个摄像头接触与控制解控相连[10],根据合适的汽车选择相应的摄像头,并使用编程程序结合SCCB协议完成实时疲劳检测系统中摄像头电路的设计.
通过内置摄像头拍摄的驾驶员驾驶状态图像,可以确定驾驶员面部初始状态.假设驾驶员的面部图像内含有n个像素,并用{ai},i=1,…,n表示其所在的位置,那么对于驾驶员面部图像进行划分[11],得到m个相等的像素图,则驾驶员面部图像的目标模型概率分布为
(1)
在第t帧时,以t-1帧驾驶员面部图像的位置f0为中心,得到候选驾驶员面部位置坐标f的位置,获取驾驶员面部跟踪直方图,面部图像区域内的像素用{ai},i=1,…,n表示,则驾驶员面部图像候选模型的概率密度为
(2)
其中,ξ为目标函数的大小.
利用相似函数,确定驾驶员面部图像的目标模型与候选模型之间的关系[12],公式为
(3)
经过上述过程,确定了驾驶员面部图像每个像素点的位置,如此重复,完成对驾驶员面部图像的跟踪.
基于OpenCV设计驾驶员瞳孔识别程序进行软件编程,将瞳孔识别程序应用在OpenCV的固定模块上[13],实现对驾驶员瞳孔的识别.基于OpenCV设计驾驶员瞳孔识别程序如下图4所示.
图4 驾驶员瞳孔识别程序
Step1 内置摄像头初始化.对驾驶员瞳孔识别前,对驾驶室内的内置摄像头进行重置[14],使其满足车内拍摄条件;
Step2 设置拍摄的分辨率.将内置摄像头的分辨率调至最佳,使其分辨率为1080×1080使拍摄图像达到最优化;
Step3 图像的拍摄.内置摄像头调试完毕后,可以进行初始化处理[15],完成拍摄工作;
Step4 图像处理.对拍摄完的驾驶员瞳孔图像进行灰度处理,得到最终所需的灰度处理图;
Step5 OpenCV计算.根据数据挖掘处理技术对处理完的灰度处理图进行二进制处理;
Step6 驾驶员瞳孔识别.通过上一步数据挖掘处理技术的处理后,用haar算子对驾驶员的瞳孔图像进行识别,识别后的驾驶员瞳孔灰度图的规格和大小分别设置为(x,y,w,h),即得到驾驶员瞳孔识别结果所在的坐标系,如果识别失败返回空白的单元组;
Step7 对驾驶员瞳孔进行定位.通过上述识别后的驾驶员瞳孔的元组(x,y,w,h)对驾驶员瞳孔进行定位,定位完成后可确定驾驶员的驾驶状态.
基于OpenCV的驾驶员瞳孔识别流程根据瞳孔的具体位置可以获取最终的识别结果,如果识别过程中不存在空元组说明识别完成,如果存在空元组说明识别失败,需要重新进行识别.通过驾驶员瞳孔识别程序可确定驾驶员的眨眼频率,如果驾驶员的眨眼状态处于非正常范围内,说明驾驶员处于疲劳状态.
利用OpenCV编程函数库设计了驾驶员实时疲劳检测系统的硬件和软件之后,需要结合系统测试,验证系统的软硬件配置是否符合预期设计要求.
汽车驾驶员实时疲劳检测系统测试平台是以OpenCV编程函数库为开发平台,采用CB770摄像头采集驾驶员的面部图像,利用C_PLR接口与显示器连接,将图像采集结果显示在界面中,音频接口与扬声器连接在一起,实现音频报警功能,实时疲劳检测系统是以PM_9352NL芯片为处理核心,对驾驶员的图像进行采集、疲劳时的视觉提醒以及音频报警.
基于OpenCV 实时疲劳检测系统在测试过程中,相关的实验参数设置如下.Windows 7操作系统;4.0GB的内存环境;W90_E800 6.4GHz的中央处理器;编程环境选择Visual C++ 5.0 .
在测试驾驶员的眨眼频率时,需要驾驶员长时间驾驶汽车,但是由于驾驶员长时间驾驶存在一定危险性,因此本文采用主动控制驾驶员眨眼频率的方式进行测试,测试时间点分别选择高亮度环境的12∶00,中等亮度环境的17∶00和低亮度环境的20∶00,采用手动记录的方式,记录驾驶员的眨眼次数,并利用基于OpenCV 实时疲劳检测系统计算出驾驶员的眨眼频率,从计算结果中抽取部分典型数据,结果如表2所示.
从表2的结果可以看出,采用基于OpenCV 实时疲劳检测系统对驾驶员的眨眼频率进行测试时,影响驾驶员眨眼频率的因素有两个,其一是驾驶员眨眼频率的快慢,当驾驶员的眨眼频率比较快时,可能是由于瞳孔识别程序正在处理其他识别任务,错过了驾驶员闭眼动作的识别,驾驶员的眨眼频率变快,说明闭眼的时间变短了,但是当驾驶员的眨眼频率低于40次/min时,基于OpenCV 实时疲劳检测系统的准确率可以达到97.5%;其二是测试环境亮度对基于OpenCV 实时疲劳检测系统测量精度的影响,当驾驶员的眨眼频率相同时,随着测试环境亮度逐渐变亮,基于OpenCV 实时疲劳检测系统对驾驶员眨眼频率的检测误差越来越小,但是驾驶员眨眼频率的检测准确率可以达到96.5%以上.
表2 驾驶员眨眼频率测试结果
表2的结果表明,基于OpenCV 实时疲劳检测系统在测试过程中,虽然检测准确率会受到驾驶员眨眼频率和测试环境亮度的影响,但是仍然可以满足系统的设计要求.
在测试驾驶员的打哈欠频率时,不同的亮度条件下驾驶员的打哈欠频率也存在一定差异,本文选取不同亮度环境下进行测试,实验条件与3.3相同,打哈欠频率测试结果如表3所示.
从表3的结果可以看出,采用基于OpenCV 实时疲劳检测系统对驾驶员的打哈欠频率进行测试时,发现打哈欠频率的快慢和环境中的亮度是影响驾驶员打哈欠频率的两个主要因素,如果驾驶员在驾驶过程中的打哈欠频率越来越快,可能是由于图像传感器和驾驶员面部图像跟踪算法正在处理其他图像的识别任务,错过了驾驶员打哈欠动作的识别,驾驶员的打哈欠频率变快,说明打哈欠的时间变短了,但是当驾驶员的打哈欠频率低于8次/min时,基于OpenCV 实时疲劳检测系统的准确率可以达到97%;在测试环境亮度对基于OpenCV 实时疲劳检测系统测量精度的影响中,当驾驶员的打哈欠频率相同时,随着测试环境亮度逐渐变亮,基于OpenCV 实时疲劳检测系统对驾驶员打哈欠频率的检测误差越来越小,但是驾驶员打哈欠频率的检测准确率可以达到97.3%以上.
表3 驾驶员的打哈欠频率测试结果
表3的结果表明,采用基于OpenCV 实时疲劳检测系统在测试过程中,虽然打哈欠频率检测准确率会受到驾驶员打哈欠频率和测试环境中亮度因素的影响,但是仍然可以满足系统的设计要求.
将文献[4]系统和文献[5]系统以及本文系统作为实验对比系统,以此对比不同系统对于疲劳检测时间来验证不同方法的检测效率.疲劳检测时间对比结果如图5所示.
图5 三种系统疲劳检测时间对比
由图5中的数据可知,本文系统的疲劳检测时间始终在0.7s以下,而文献[4]系统的疲劳检测时间在1.2 s~1.7%,而文献[5]系统的疲劳检测时间在1.8%~2.6%,远高于本文系统,所以说明了本文系统可以快速检测出疲劳驾驶问题,实际应用效果好.
将文献[4]系统和文献[5]系统以及本文系统作为实验对比系统,以此对比不同系统对于疲劳检测正确率.疲劳检测正确率是指正确检测出的疲劳事件量占疲劳驾驶事件总量的比率,对比结果如图6所示.
图6 三种系统检测时间对比
由图6中的数据可知,本文系统的疲劳检测正确率始终在95%以上,而文献[4]系统的疲劳检测正确率在55%~81%,而文献[5]系统的疲劳检测正确率在53%~82%,远低于本文系统,所以说明了本文系统可以正确检测出疲劳驾驶问题,实际应用效果更好.
本文提出了基于OpenCV 实时疲劳检测系统的研究,经过测试发现,该系统在驾驶员疲劳检测中,可以准确判断驾驶员是否处于疲劳驾驶状态.但是本文的研究还存在很多不足,在今后的研究中,希望可以进一步优化驾驶员佩戴眼镜对系统的检测干扰,增强系统的适用性.