基于MATLAB的疲劳检测代码

基于MATLAB的疲劳检测系统

一、课题介绍

随着汽车工业的不断发展,随之而来的社会问题也愈加严重。交通事故给人们造成巨大伤害的同时,也给社会带来沉重的负担和影响。由于疲劳驾驶是引起交通事故的一个主要原因。因此,研究一种合理有效、实时准确检测驾驶员疲劳驾驶的非接触式车载装置对于减少交通事故,道路安全有重大意义。

本文研究的主要内容包括:人脸检测、人眼定位、眼睛特征提取和状态识别、疲劳程度的计算等算法的原理及实现。

二、研究背景及意义

所谓的疲劳驾驶,是指驾驶员在长时间持续驾驶或睡眠不足情况下而造成的反应能力下降,其主要表现在驾驶员困倦、驾驶操作反应迟钝或完全丧失驾驶能力。因疲劳驾驶而在全球每年导致数以万计的交通事故和大量人员伤亡。据公安部交通管理局数据,2010年全国共接报道路交通事故3906164起,同比2009年上升35.9%。其中,涉及人员伤亡的道路交通事故219521起,造成65225人死亡、254075人受伤,直接财产损失9.3亿元。其中疲劳驾驶被列为超速行驶,酒后驾车之后的第三大引发道路交通事故原因。引起驾驶员疲劳驾驶的原因除上述的睡眠不足、长时间持续驾驶外,还与工作性质与时间、人的生理周期、酒精以及药物,乃至不同人的生活习惯、身体状况、年龄差异有关;另外,即使驾驶员状态良好或者在注意力高度集中的情况下,如果面对景色单一的高速公路,也容易因公路催眠而产生驾驶疲劳,从而导致自我控制能力减弱、判断迟缓、动作僵硬、视力下降、注意力分散以及视野变窄等不良反应从而发生交通事故疲劳驾驶作为引发道路交通安全事故的重要原因,越来越引起人们的重视。

由此可见,疲劳驾驶是一个比较严峻的问题,主要是由于它的隐蔽性很强,疲劳驾驶的发生很难预测和判定。因此,当驾驶员刚出现疲劳症状时,如果能发出预警,或者自动降低车速甚至强制其停车休息,则可以有效地加强行车安全,减少由于疲劳驾驶所引起的交通事故,避免因此产生的经济损失和人员伤亡。在过去的几十年中,国内外专家和学者都在积极研究疲劳驾驶,对疲劳检测的方法也做了各方面的探索,在一定程度上取得了很大的进步,但在实际应用过程中,还存在较多的问题,因此,如何及时有效的检测出驾驶员的疲劳程度,减少因疲劳驾驶而引发的交通事故已经成为当前智能运输系统的研究热点。为了降低因疲劳驾驶导致的交通事故发生率和人员伤亡数量,降低人为因素导致的交通安全隐患,本文对人眼疲劳值算法进行了研究。

三、 人脸检测与定位技术

对于人眼疲劳检测的研究,首先要检测到人脸,在此基础上提取眼睛的状态参数作为特征信息来实现。因此疲劳驾驶检测基础是人脸以及人眼的检测定位,人脸检测旳方法有很多,使用特定的硬件设备,采用红外照明,可以直接检测出睛孔的准确位置,从而定位出眼睛,进行后续的测量;其次可以先通过检测出人脸,减小图像中的搜索范围,再对检测的人脸区域进行搜索,找出眼睛的位置。前一种利用硬件定位虹膜的方法,一旦眼睛识别失误,系统将不能运行,而后一种方法,只要准确的检测出人脸,就可以定位人眼的位置。本文采用先检测出人脸的位置,然后在人脸区域进行眼睛定位的方案。

四、人眼定位技术

在第 1 章中讲到,采用 PERCLOSE 原理的疲劳驾驶检测方法,关键是能够准确判断出驾驶员眼部的睁闭状态,但是在这之前还要能够在图像中准确定位出驾驶员的眼睛区域的位置,所以在驾驶员疲劳识别中,人眼的定位和状态识别是基于 PERCLOSE 的疲劳检测方法的关键步骤。

在整个驾驶员疲劳检测系统中为了能够准确的检测到眼睛区域,可以采用先确定人脸区域,然后在人脸区域内进一步检测、定位人眼的方法,这样可以使得眼睛的检测与定位相对准确一些。因为同一个人的人脸和眼睛相比较,人脸拥有更多的信息量,检测人脸相对于定位眼睛会更容易更准确。识别出人脸区域有利于缩小眼睛定位的范围,避免被背景图像所干扰。不仅如此,研究人脸定位的意义还在于,人脸定位的技术也可以同时给眼睛定位提供参考。图 4.1 是利用人脸识别的驾驶员疲劳检测流程图。

图 4.1 运用人脸识别的驾驶疲劳检测系统图

本系统首先从视频帧中提取出人脸,再在人脸区域上搜索人眼,进行眼睛区域的定位。由于人脸检测和人眼检测的实现原理基本一致,因此本章接下来将主要以人眼检测为例进行阐述。

图 3.5 人眼定位检测结果图

五、 人眼状态识别

疲劳是一种生理状态,尤其是驾驶员在驾驶过程中产生的一种综合性的生理心理过程,疲劳状态下驾驶员在生理和心理方面的表现是联系相互影响的。通过前人的大量研究驾驶员在疲劳时生理表现主要体现在头部和眼睛的变化,如视线偏离前方、头部缓慢的低下、眼睛闭合时间较长以及泛眼频率高等特点,综合很多因素眼睛的状态是表征疲劳最重要的特征,人眼主要由上下眼险、眼球、瞳孔以及左右内外眼角构成,而眼睛的挣闭状态主要体现在眼睑位置的变化和尤其所覆盖的瞳孔面积的大小上。常用的检测方法主要有 Hough 查找圆法、灰度投影法、模板匹配法。本文采用基于椭圆拟合的人眼状态分析。

方法:基于椭圆拟合的人眼状态分析

眼睛状态主要指眼睛的睁开程度,眼睛的睁开程度又与人眼的轮廓相关。常用的椭圆拟合的方法主要有 2 种,一种是基于 Hough 变换的椭圆拟合方法,一种是使用最小二乘法进行椭圆拟合。基于最小二乘法适用于各种复杂的对象模型,能达到很高的拟合度。本文就采用基于最小二乘法来拟合人眼的轮廓,然后根据拟合椭圆的长短轴比例来判断人眼的状态。

最小二乘法拟合椭圆,就是通过计算边缘点到理想拟合椭圆距离的平方和的最小值来确定理想椭圆拟合的参数集合。通过对人眼轮廓进行椭圆拟合后,就可以根据拟合的椭圆参数来表示人眼轮廓的形状信息。

为椭圆的中心坐标点,a是椭圆的长轴,b为椭圆的短轴,是长轴相对于水平坐标的偏转角。

因此,对人眼轮廓进行椭圆拟合后,就可以很直观的想到利用椭圆的长短轴的比来确定人眼的状态,即通过来判断人眼的睁闭状态。通过实验分析发现,当时,可以认为眼睛处于睁开状态,否则眼睛处于疲劳状态的半闭合状态或完全闭合状态。

表 5.1 是对三组测试视频集的人眼状态分析的结果,测试视频光照较好,图像清醒,测试集 1 是清醒状态,其它有部分疲劳状态。图 5.1 是驾驶员眼睛轮廓椭圆拟合部分结果图。

表 5.1 人眼状态识别结果

测试集

测试1

测试2

测试3

正确率%

91.60

84.23

90.52

(a) 睁眼状态(正常) (b) 半睁眼状态(疲劳) (c) 闭合状态(疲劳)

表 5.1 的实验结果说明,基于椭圆拟合的人眼状态识别方法有较好的识别效果,但受限于眼部图片的分辨率及清晰度,而且眼睛的睁闭状态,尤其是半睁开半闭合状态的判断带有很强的主观性,因此识别率不是非常好,本文的实验结果不作为一般性结论。以后可以考虑融合其它特征识别人眼状态。

六、 基于PERCLOS标准的疲劳状态分析

找出一种既容易观察,又方便测试的疲劳特征一直是疲劳驾驶检测技术关注的方向。1994 年美国首次提出单位时间眼睛闭合的百分比(percentage of eyelid closure over the pupil over time, PERCLOS)用于描述驾驶员的疲劳状况。1999 年美国联邦高速公路管理局召集专家学者,研究讨论 PERCLOS 和其它人眼活动测量方法的有效性,并通过对实验数据的对比,证明了 PERCLOS 相对于驾驶员其他特征,更能直接反映驾驶员的疲劳程度,研究认为应该优先考虑将测量驾驶员的PERCLOS 作为车载的、实时的、非接触式的疲劳检测方法。

6.1 PERCLOS方法介绍

当人处于疲劳状态时,眨眼时间即眼睛从睁开—闭合—睁开所用的时间变长,并且眨眼时间的长短与疲劳程度有密切的关系,驾驶员眨眼的时间越长,疲劳程度就越严重,因此通过测量驾驶员眼睛闭合时间的长短可以在一定程度上反映驾驶员的疲劳状态。

图 6.1 驾驶员眼睛睁开度图

在具体实验时 PERCLOS 通常有 P70,P80,Em 三种测量方式:

P70:眼皮盖过眼球的面积超过 70%所占的时间比例。

P80:眼皮盖过眼球的面积超过 80%所占的时间比例。

Em:眼皮盖过眼球的面积超过 50%所占的时间比例。

我们通常选择p80 作为疲劳判定的标准,当眼睛挣开程度大于20%为眼睛挣开状态,眼睛挣开程度小于或者等于20%时为眼睛闭合状态。PERCLOS 的测量原理可以用图 6.1 来说明。分别测量出,,,即可计算出 PERCLOS 的值 f ,即眼睛闭合占某一特定时间的比例。

通过多次实验得出,定义当PERCLOS值f>0.12时,驾驶员处于疲劳状态;

七、源码

附录A

x=imread('C:\wuzun.jpg'); %读取原始图像

figure(1);subplot(1,4,1);imshow(x);title('原图像1');

y=rgb2gray(x);

subplot(1,4,2);imshow(y);title('图像1的灰度图'); % 图1灰度图

u1=imnoise(y,'salt & pepper',0.07);

subplot(1,4,3);imshow(u1);title('图像1加噪声图'); %给图1加椒盐噪声

zz=medfilt2(u1,[3 3]);z=medfilt2(zz,[5 5]);%(2次中值滤波)

subplot(1,4,4);imshow(z);title('图像1中值滤波'); %图1中值滤波(3*3窗口)

% figure(6);subplot(1,2,1);imshow(zz);title('一次滤波');

% subplot(1,2,2);imshow(z);title('二次滤波');

x1=imread('C:\wuzun1.jpg');

figure(2);subplot(1,4,1);imshow(x1);title('原图像2');

y1=rgb2gray(x1);

subplot(1,4,2);imshow(y1);title('图像2灰度图'); %图2灰度图

u2=imnoise(y1,'salt & pepper',0.13);

subplot(1,4,3);imshow(u2);title('图像2叫噪声图'); %图2加椒盐噪声

zz1=medfilt2(u2,[3 3]);z1=medfilt2(zz1,[5 5]);%(2次中值滤波)

for j=10:w

if Amax<=f(i,j)

Amax=f(i,j);m=i;n=j;

end

end

end

%标另外一只眼睛

Bmax=0;m1=0;n1=0;

for i1=10:m-10

for j1=10:w-10

if Bmax<=f(i1,j1)

Bmax=f(i1,j1);m1=i1;n1=j1;

end

end

end

for i2=m+10:h-10

for j2=10:w-10

if Bmax<=f(i2,j2)

Bmax=f(i2,j2);m1=i2;n1=j2;

end

end

end

%判断两眼的参数是否符合要求

figure(7);imshow(z);hold on;plot(n,m,'+',n1,m1,'+');title('标定眼睛图');

%给眼睛画上矩形框

figure(8);imshow(z),title('眼睛粗定位');hold on;

Bvertex=[n-25 m-15;n+25 m+15]; %矩形的左上顶点坐标和右下顶点坐标

plot([Bvertex(1,1),Bvertex(2,1)],[Bvertex(1,2),Bvertex(1,2)],'r')

plot([Bvertex(2,1),Bvertex(2,1)],[Bvertex(1,2),Bvertex(2,2)],'r')

plot([Bvertex(2,1),Bvertex(1,1)],[Bvertex(2,2),Bvertex(2,2)],'r')

plot([Bvertex(1,1),Bvertex(1,1)],[Bvertex(1,2),Bvertex(2,2)],'r');

hold on;

Bvertex=[n1-25 m1-15;n1+25 m1+15]; %矩形的左上顶点坐标和右下顶点坐标

plot([Bvertex(1,1),Bvertex(2,1)],[Bvertex(1,2),Bvertex(1,2)],'r')

plot([Bvertex(2,1),Bvertex(2,1)],[Bvertex(1,2),Bvertex(2,2)],'r')

plot([Bvertex(2,1),Bvertex(1,1)],[Bvertex(2,2),Bvertex(2,2)],'r')

plot([Bvertex(1,1),Bvertex(1,1)],[Bvertex(1,2),Bvertex(2,2)],'r');

%计算直方图

for i=1:height

for j=1:width

m=z(i,j)+1; %zz(i,j)灰度值从0-255

hist(m)=hist(m)+1;%某级灰度的像素数

end

end

hist=hist/(height*width);%落在每一灰度级上的概率

avg=0;

for m=1:256

avg=avg+(m-1)*hist(m);

end

temp=0;

for i=1:256

p1=0;

avg1=0;

avg2=0;

T_current=i-1;%当前分割阈值

for m=1:T_current-1

p1=hist(m)+ p1;%低灰度级概率总和

end

p2=1-p1;%高灰度级概率总和

for m=1:256

end

avg1=avg1/p1;

avg2=avg2/p2;

D=p1*(avg1-avg)^2+p2*(avg2-avg)^2;

if D>=temp

finalT=T_current;

temp=D;

end

end

% 滤波后差分图二值化

f1=z;

for i=1:h

for j=1:w

if f1(i,j)<=finalT

f1(i,j)=0;

else

f1(i,j)=255;

end

end

end

figure(13);imshow(f1);title('差分后图二值化');

%提取眼睛轮廓

%精确定位眼睛矩形,最高点、最低点、最左边、左右边四点确定的矩形。

%一只眼轮廓

[h1,w1]=size(f1);

zg=0;zd=0;zzb=0;zyb=0;

%i3=0;j3=0;

xj=50;yj=30;%垂直和水平方向中心点矩形大小一半

x3=zeros(1,100);y3=zeros(1,60);

x4=zeros(1,100);y4=zeros(1,60);

x5=zeros(1,100);y5=zeros(1,60);

x6=zeros(1,100);y6=zeros(1,60);

zgx=0;zdx=0;zzbx=0;zybx=0;

zgy=0;zdy=0;zzby=0;zyby=0;

%最高的点y

for i3=n-50:n+50

for j3=m-30:m+30

if f1(i3,j3)==255&f1(i3,j3+1)==0

x3(i3-n+51)=i3;y3(j3-m+31)=j3;

end

end

end

for k=1:1:100

if zgy<y3

zgy=y3;

end

end

%最低点y

for j3=m-30:m+30

for i3=n-50:n+50

if f1(i3,j3)==255&f1(i3,j3-1)==0

x4(i3-n+51)=i3;y4(j3-m+31)=j3;

end

end

end

for k=1:1:100

if zdy<y4

zdy=y4-1;

end

end

%最左点x

for j3=m-30:m+30

for i3=n+50:1:n-50

if f1(i3,j3)==255&f1(i3+1,j3)==0

x5(i3-n+51)=i3;y5(j3-m+31)=j3;

end

end

end

for k=1:1:100

if zzbx<x5

zzbx=x5+1;

end

end

%最右点x

for j3=m-30:m+30

for i3=n+50:1:n-50

if f1(i3,j3)==255&f1(i3-1,j3)==0

x6(i3-n+51)=i3;y6(j3-m+31)=j3;

end

end

end

for k=1:1:100

if zybx<x6

zybx=x6-1;

end

end

%精确画出眼睛矩形区域

figure(9);imshow(f1),title('眼睛轮廓');hold on;

Bvertex=[215 163;241 175]; %矩形的左上顶点坐标和右下顶点坐标

plot([Bvertex(1,1),Bvertex(2,1)],[Bvertex(1,2),Bvertex(1,2)],'r')

plot([Bvertex(2,1),Bvertex(2,1)],[Bvertex(1,2),Bvertex(2,2)],'r')

plot([Bvertex(2,1),Bvertex(1,1)],[Bvertex(2,2),Bvertex(2,2)],'r')

plot([Bvertex(1,1),Bvertex(1,1)],[Bvertex(1,2),Bvertex(2,2)],'r');

%另一只眼轮廓

hold on;

Bvertex=[139 154;170 167]; %矩形的左上顶点坐标和右下顶点坐标

plot([Bvertex(1,1),Bvertex(2,1)],[Bvertex(1,2),Bvertex(1,2)],'r')

plot([Bvertex(2,1),Bvertex(2,1)],[Bvertex(1,2),Bvertex(2,2)],'r')

plot([Bvertex(2,1),Bvertex(1,1)],[Bvertex(2,2),Bvertex(2,2)],'r')

plot([Bvertex(1,1),Bvertex(1,1)],[Bvertex(1,2),Bvertex(2,2)],'r');

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值