APP下载

基于OpenCV的人眼检测及疲劳判断

2018-11-22浙江大学城市学院信息与电子工程系尚丽娜石晴瑶

电子世界 2018年21期
关键词:人眼张开级联

浙江大学城市学院信息与电子工程系 尚丽娜 石晴瑶 方 健

引言:个人驾驶出行所具备的高自由度以及私家车的大范围普及给人们提供了便利的同时也带来了很多安全隐患。车辆驾驶者特别是长途货运司机和客运司机若是没有得到良好且充沛的休息时间,就很有可能会引发疲劳驾驶。而在公路尤其是高速公路上驾驶员必须时时刻刻保持警惕清醒的驾驶状态,一恍惚的走神都有可能引发交通事故从而造成严重的后果甚至危及人命,与此相比疲劳驾驶更是可怕。人处在疲劳状态中是不会有平时那么快的反应时间和平时那么敏捷的反应能力的,在车来车往的马路上这种状态更是可能造成严重的交通事故,且根据相关统计,疲劳驾驶所引发的交通事故的数量占事故总数的一大部分,而在日常生活中因疲劳而导致的工作效率降低以及不必要的麻烦也十分常见。而疲劳驾驶以及各项因疲劳状态而导致的事故所发生的大部分原因是参与者并未意识到自己已经身处疲劳状态,所以在意识到自己已处于疲劳状态之前及时让自己得到提醒可以让许多因疲劳而带来的后果避免发生,从而大大降低各种因疲劳而导致的事故发生。基于此种现状,设计了疲劳检测系统,可以对被测者进行疲劳程度检测,并进行相应提醒,从而避免很多事故的发生。

1.系统框架设计

图1 设计流程框图

人眼检测率离不开人眼检测算法和多次定时获取当前帧图像的操作,这一切又都是以图像数据的获取作为前提的。该人眼检测及疲劳检测系统的主要流程划分为六个,分别是“获取图像”部分,“人脸检测”部分,“人眼区域计算”部分,“人眼检测”部分,“单位时间人眼检测率计算”部分以及“结果判定”部分,如图1所示。

单单使用现成的人眼检测算法会带来很大的误判率,既影响成果的使用效率,也影响结果的正确率。先进行人脸检测后再通过坐标的方式进行区域划分和人眼长度与宽度的预测来确定人眼区域,使用这种方式大大提高了人脸人眼检测的准确率和效率。

2.系统设计原理

在开始疲劳检测之前需要先打开摄像头来完成图像数据的采集或是使用按钮打开图片获取图像,完成图像数据采集之后需要完成图像数据的传输,接下来使用已有的人脸检测算法来检测出人脸的所在位置,之后再通过对人脸长度人脸宽度进行计算来完成坐标的设置,再以程序编写的形式实现人脸上人眼区域的位置预估及大小计算,并在通过预测计算得出的区域进行人眼检测,从而提高人眼检测的工作效率以及减少误判概率。因为人处于疲劳状态时人眼的张开力度会出现明显的减小,现成的人眼检测算法在人眼张开力度较小时检测不到人眼,所以可以将单位时间内的人眼检测率数值作为疲劳判断的重要依据。同时检测到人眼后以人眼的张开的宽敞比例进行人物疲劳程度的再次判断。

图2 级联分类器

本系统中的人脸检测使用Adaboost级联分类器。haar分类器的结构如下。

Haar分类器 = Haar-like特征+积分图方法+Adaboost+级联

图3 程序对话框界面

图4 测试结果1

图5 测试结果2

Haar分类器由Haar-like特征加积分图加Adaboost再加级联构成,具体强分类器的方式如下。

haar分类器可由多个强分类器进行级联组合,级联分类器图像如图2所示。

3.系统设计实现

3.1 检测前的图像预处理

图像数据的预先处理过程主要包括了“灰度化cvtColor”处理和“直方图均衡化EqualizeHist”处理;因为在对物体的识别过程中,识别的关键就是对物体边缘的认识程度,而影响对物体边缘认知程度的本质在于梯度,可是计算梯度时所要求的处理对象必须是灰度图,所以在进行检测之前先对图像进行灰度化处理是不可少的预备工作。经过这些处理之后再进行人脸检测,可以获得不错的检测效果。

图像预处理的部分代码实现如下所示。

3.2 人眼区域的划分

因为直接采用现成的人眼检测算法进行人眼检测会因为检测区域较大的因素而存在不小的误判率,与此同时检测效率也较低,会导致整个程序的响应变慢。而在进行人眼检测模块之前,先利用已经训练好的结果进行人脸的检测,再通过对人眼位置的预测而进行人眼区域的划分,最后再在划分出来的人眼区域内通过现成训练好的XML文件进行人眼检测。因此,在正式进行人眼检测的工作前先进行人眼区域的预测划分是具有实用特质的。

通过对人脸的长度采集以及人脸宽度采集,并对采集到的数据加以数据运算,可以得到人眼区域的大致位置以及区域大小。同时实现对人左眼位置和右眼位置的分别预测,在完成人眼区域的预测之后再针对预测出来的区域进行人眼检测可以在很大程度上提高人眼检测的准确率,并且在此同时可以大大提高工作效率,为实时输出判断结果打下基础。

3.3 疲劳判断

被测者在比较疲劳的时候,眼睛会张开比较小,甚至有可能偶尔闭上,这种情况下,用已有的人眼检测算法不能检测到人眼,所以可以通过最终能否检测出人眼来判断是否疲劳。在此基础上再次在检测到人眼后通过人眼的长宽比例来判定人物的疲劳程度。

3.4 实时输出

为了实现实时输出,需要先获取当前的时间,函数GetTime()可以帮助我们实现这一功能,主要代码如下。

4.系统实现及评价

系统最终实现的运行对话框界面如图3所示。

人脸及人眼的区域在左侧,通过矩形框了出来,在眼睛正常张开的情况下,检测结果区(在后侧)快速地输出了检测时间及检测结果偏精神的结论,如图4所示。

被测者减小了眼睛的张开力度,显示出疲劳状态,检测结果变为偏疲劳,如图5所示。

在被测者戴眼镜和不戴眼镜的不同情况下,该程序都能检测出被测者的疲劳程度。

5.结论

本系统能够快速进行人眼区域划分及疲劳判断,并且检测结果区迅速输出检测结果;在是否佩戴眼镜的两种情况下都能保持较为良好的工作效率和准确率。

经过测试,该程序性能稳定,效果良好。

猜你喜欢

人眼张开级联
开花
人眼X光
人眼为什么能看到虚像
闪瞎人眼的,还有唇
级联LDPC码的STBC-OFDM系统
看人,星光璀璨缭人眼
基于级联MUSIC的面阵中的二维DOA估计算法
LCL滤波器在6kV级联STATCOM中的应用
H桥级联型STATCOM的控制策略研究