MATLAB疲劳检测系统

目录

摘要 I

Abstract II

1 绪论 1

1.1 研究背景及意义 1

1.2 国内外疲劳驾驶研究现状 2

1.3本文的主要研究内容及组织结构 3

2 人脸检测与定位技术 4

2.1人脸检测与定位技术概述 4

2.1.1基于图像的人脸检测方法 4

2.1.2基于特征的人脸检测方法 5

2.2 Adaboost算法介绍 6

2.2.1 AdaBoost 算法描述 7

2.3 AdaBoost算法分类器 10

2.3.1 分类器级联策略 10

2.3.2 级联分类器误差分析 11

3 人眼定位技术 12

3.1 常见的几种人眼检测方法 12

3.2 矩形特征及积分图 14

3.2.1 矩形特征 14

3.2.2 积分图 15

3.3 AdaBoost算法的改进 16

3.4 构建双层AdaBoost分类器进行人眼检测 18

3.4.1 人脸定位与人眼定位的差异 18

3.4.2 人眼定位预处理 19

3.4.3 人眼定位双层分类器的构建 20

3.5 人眼定位算法的设计与实现 20

4 人眼状态识别 21

4.1 基于椭圆拟合的人眼状态分析 21

5 基于PERCLOS标准的疲劳状态分析 23

5.1 PERCLOS方法介绍 23

6 总结 25

参考文献 26

附录A 28


摘要

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

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

首先详细阐述了经典的 AdaBoost 算法,该算法涉及的内容包括 Haar-Like 特征,弱分类器,级联的 AdaBoost 分类器等。然后利用 AdaBoost 算法进行人脸检测。

虽然 AdaBoost 算法的检测速度快,误识率低,但是在样本的权重更新过程中,对于分类错误样本中的正、负样本没有加以区分,不利于提高正样本的识别率。本文提出一种新的权重更新方法,对于分类错误的样本,对判断错误的正样本给更高的权重,使得算法在下一轮迭代时,更加关注对分类错误的正样本的学习,从而提高对正样本(人眼)的检测率。采用基于最小二乘法对眼部的外轮廓进行椭圆拟合,根据拟合椭圆的参数来判断眼睛的睁闭状态;采用结合 PERCLOS 和眨眼频率的方法,对疲劳状态进行检测。

关键词:疲劳检测,AdaBoost,人眼定位,PERCLOS


Abstract

With the development of the automobile industry continuously, the social problems are more and more severe. The traffic accidents not only cause great harm to the people,but also bring heavy burden and effect to society. Because fatigue driving is a major reason that caused traffic accidents. Therefore, research a reasonable and effective real-time and non-contact device due to the detection of driver fatigue driving has great significance for reducing traffic accidents and raising road safety.

In this paper, the main research contents are face detection, eye location, eye feature extraction, principle and realization of the calculation of fatigue’ degree.

Firstly, the classical AdaBoost algorithm is produced in detail. which involves Haar-Like features, weak classifier,cascade AdaBoost classifier, etc. Next, face is detected based on AdaBoost algorithm.

Although the AdaBoost algorithm with a low false positive rate is fast, there is no distinction between samples of error classification in the procedure of weight updating,which ignores hit rate of positive samples. In this paper, a new method of weight updating is proposed to improve the hit rate of positive samples, which pays more attention to positive samples of error classification.After the region of driver’s eyes is obtained, the ellipse fitting algorithm based on least squares method is used to fit the eye contours, and the eye state is identified according to parameters of ellipse. Then, the fatigue state could be detected based on PERCLOS and blink frequency.

Keywords: fatigue detection, AdaBoost, eye location, PERCLOS

1 绪论

1.1 研究背景及意义

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

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


1.2 国内外疲劳驾驶研究现状

目前国外的许多国家都对汽车安全方面投入了大量的资金,用来解决交通安全的问题。许多高校和科研机构也都在该方面进行了大量的研究,并取得了丰硕成果。

日本一家公司利用装置在驾驶员头部上方的传感器来判定司机头部位置。传感器利用驾驶员头部与其之间的距离计算并跟踪头部在三维空间当中所处的位置,然后依据不同时间下驾驶员头部产生的位移变化判断其是否处于疲劳状态。利用装置在方向盘上的心跳感应器来检测驾驶员的心跳速度,该系统每隔一段时间检测一次,当司机处于疲劳状态时心跳速度减慢,因此可以简单易行的判断出驾驶员是否处于疲劳状态。

英国科学家为司机研制的防瞌睡报警系统,可以监视司机开车时的眼睛和肌肉运动,大脑活动及心率等,如发现异常,系统能及时发出报警。

美国研制的疲劳检测系统 DDDS(The Drowsy Driver DetectionSystem)。此系统采用多普勒雷达和复杂的信号处理方法获取驾驶员烦躁不安的情绪活动、眨眼频率和持续时间等疲劳数据,判断驾驶员是否处于瞌睡状态。该系统可以做成一个比较小的装置,放在驾驶员头顶上方,或头顶前方某个地方,以免影响驾驶员的驾驶。

2005年,澳大利亚的研究人员推出一款眼镜,通过内置于眼镜中的红外线传感器监测司机的眼睑活动和眨眼频率,并据此判断司机是否疲劳。

国内在人脸识别技术和驾驶员疲劳检测的研究方面起步较晚,相关技术还不成熟,同发达国家相比还有很大的差距,但一些高校和研究机构还是投入了大量的精力进行研究,经过几十年的努力,在驾驶疲劳检测方面也取得了一系列的成果。江苏大学也在研究 PERCLOS 算法的基础上,设计出一套系统,该系统使用波长为 850/950mm的红外图像仪及差分图像仪作为图像采集器,由于利用红外光源成像,排除了环境光源的干扰,提高了装置的适用性,满足各种驾驶情况下对驾驶员状态的监测要求,同时可以得到关于关键部位(眼部)的差分图像,提高了系统的实时处理能力,有一定的实用价值。


1.3本文的主要研究内容及组织结构

本文主要研究了人脸检测和人眼定位基础上的疲劳驾驶检测方法,重点研究了快速的Adaboost人脸检测算法,Mean-shift眼睛跟踪算法,主要目的是在经典的人脸检测和定位算法的基础上寻求一种改进的算法从而提高疲劳驾驶检测的实时性和准确性。具体工作如下:

(1)研究并实现了对于静态图像和视频流中快速的人脸检测定位的问题。采用经典的Adaboost算法实现了人脸的快速检测定位,该方法对于单个图像的检测率非常高且耗时很少,满足疲劳驾驶检测对于实时性的要求。

(2)研究并实现了基于Mean-shift算法的人眼实时跟踪方法。通过在人脸检测基础上眼睛粗定位的基础上,用灰度和颜色分布来表示人眼,将颜色的直方图作为特征,实现了人眼轮廓的快速的实时跟踪定位。

(3)研究实现了眼睛特征提取和状态识别的算法,通过对人眼内外角点分别进行检测定位和对人眼上眼睑中间点的定位,拟合上眼睑的轮廓曲线,利用上眼险与人眼内外眼角点连线之间的距离实现了对眼睛状态的量化分析。

(4)结合PERCLOS标准和泛眼频率实现对疲劳状态的判决。

本文共分为六章:

第1章:主要介绍了疲劳驾驶检测课题的研究背景和研究现状以及发展趋势和难点问题。

第2章:对经典的Adaboost人脸检测方法进行详细阐述,并利用该方法实现快速的人脸检测定位,并介绍利用其进行疲劳驾驶检测。

第3章:首先介绍了常见人眼定位方法,分析了各自的优缺点,再具体阐述了AdaBoost 算法采用的 Haar-Like 矩形特征,然后分析了 AdaBoost 算法的一些不足,给出了改进方案,最后提出采用人脸检测—人眼定位的双层 AdaBoost 分类器进行人眼检测。

第4章:研究实现了眼睛特征的提取和状态的识别。

第5章:人眼状态的识别和疲劳判定模块,利用PERCLOS 和眨眼频率对驾驶员进行最终的疲劳判定,达到对疲劳驾驶的预警提示。

第6章:对本文进行了总结与展望,对本文所做的工作进行总结。

2 人脸检测与定位技术

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

2.1人脸检测与定位技术概述

人脸检测是指在不同的背景条件中检测出人脸的所在,并将其从背景中分割出来,确定出其位置。此过程主要受光照、噪声、头部摆动以及其他外部条件的影响。人脸检测是我们进行疲劳驾驶检测的第一步也是基础,只有准确的检测定位出图像中人脸的准确位置,才能进行后面的工作。而在实际生活中人脸检测常用于门禁系统、图像检索、人机交互等方面。人脸检测的基础是建立人脸模型,先遍历所有的待检测区域后与所建立的人脸模型的进行匹配,之后得到可能存在人脸的区域。目前主要的人脸检测方法可以分为两大类,基于图像的人脸检测方法以及基于特征的人脸检测方法。前者属于一般的模式识别问题,将待检测图像作为人脸检测的输入,不需要对图像进行特征提取以及处理,直接进行训练后将样本分为人脸和非人脸两种类别,而后进行人脸检测:后一种方法需要提取人脸的各种特种,例如肤色信息、人脸的轮廓结构、表情信息等,这一种方法是大部分人脸检测所采用的方法,采用经典的模式识别算法来实现。

2.1.1基于图像的人脸检测方法

基于图像的人脸检测一般不考虑图像的先验知识,不需要对图像进行特征提取和处理,直接将图像作为系统的输入,利用一般的模式识别算法进行训练,将样本图像分类为人脸类和非人脸类,而后将训练得到的人脸类和待检测区域进行匹配,进行人脸检测。常见的基于图像的人脸检测方法有线性子空间法、神经网络法、统计法等。

1.线性子空间方法

可以将人脸图像看成处于整幅图像的一个子空间中。通常用神经学的方法表示子空间,也可以用诸如主元分析以及线性判定分析等方法来表示。

2.神经网络方法

神经网络方法是解决模式识别问题的重要方法,也经常被用来解决人脸识别问题。其通过训练过程中样本进行自学习,具有一定的自适应性和鲁棒性,避免了特征提取的环节,节省了运算时间。

3.统计法

除以上两类统计方法外。还有基于贝叶斯决策方法的人脸检测和基于支撑矢量机方法的人脸检测方法。

2.1.2基于特征的人脸检测方法

1.特征分析的方法

常见的有两种方法,其一将单个人脸特征的相对位置作为基础,进行序列特征搜索;其二利用各种常见的人脸模型将人脸特征分类,建立不同的群类。例如,特征搜索法和构象分析法就属于这种方法。

2.利用活动模型的方法

所谓的活动模型是指模型本身是一种真实的身体特征。活动模型同局部特征相互作用,最终逐渐的将形成所要检测特征的形状。当前常用的活动模型主要有:Snake模型点的分布模型以及变形模型它就会同局部特征相互作用,利用活动模型解决人脸定位问题是近年来比较流行的方法。

3.底层分析的方法

底层分析主要指对图像的边界、灰度、颜色、尺寸等信息进行分析比较,得到所需要的检测特征。由于基于特征的人脸检测一般都考虑图像的先验知识,基于图像边界的检测方法通过结合人脸图像尺寸的先验知识,对边界进行处理,提取角点及其边缘点,舍去那些突起的点,对整个图像进行搜寻后进行匹配确认。观察一个人的脸部图像,会发现眼睛、眉毛、嘴唇等处的灰度变化较之脸部的其他地方灰度要小。利用这样的性质,可以通过基于灰度信息的方法进行人脸检测,如通过水平方向和垂直方向的积分投影来定位眼睛和眉毛的位置,进行眼睛的检测以及定位。

2.2 Adaboost算法介绍

分类是模式识别检测的关键,人们都希望研究出精度很高的机器学习算法。机器学习算法可以粗略的分为强学习算法和弱学习算法。强学习算法准确率很高,但是往往结构复杂,计算开销很大,与算法本身的质量相比,成本过于庞大,难以在实际生活中得到广泛的应用;弱学习算法结构简单,但准确率不高,仅比随机猜测略好。一个自然的想法就是能否将弱学习器“提升”或“集成”为强学习器呢?Schapire 最初提出的 Boosting 算法就是在这种思想下建立和发展的。Boosting 算法是一种基于简单有效分类策略的机器学习方法,是集成学习的核心内容和研究热点。Boosting 是推助、提升的过程,它是将一系列比随机猜测略好的弱分类器加权组合为强分类器的算法。Boosting 这种特性受到了越来越多学者的重视,成为图像处理等领域的研究热点之一。

AdaBoost 算法最早起源于 Schapire 在 1990 年提出的 Boosting 算法,它是一种能够提高任意给定学习算法准确率的方法。AdaBoost 算法的基本思想是利用大量的分类能力一般的弱分类器(Weaker Classifier)通过一定的方法叠加(Boost)起来,构成一个分类能力很强的强分类器(Stage Classifier),再将若干个强分类器串联成为级联分类器(Classifier Cascade)完成目标的搜索检测。本文就是利用AdaBoost 算法将由 Haar-Like 特征生成的弱分类器叠加成为强分类器,再将强分类器串联成为级联分类器,进行人眼检测。在众多的 Boosting 算法中,AdaBoost算法因其有以下优点而被广泛使用:

(1)算法速度快;

(2)不需要知道任何关于弱分类器的先验知识;

(3)对弱分类器的性能要求不高,只需要比随机猜测性能稍好即可,这种弱分类器在实际情况下很容易获得,从而降低了算法的复杂度,提高了效率;

(4)在弱分类器的构成上可以兼容多种方法,这些弱分类器可以是神经网络、决策树、最近邻域分类器、经验规则等;

(5)训练数据可以是文本、数字、离散值等,并且 AdaBoost 算法很容易被推广到多类目标的分类问题中去。

2.2.1 AdaBoost 算法描述

根据假设第i个训练样本在第t次迭代时分布权重为,初始化时所有权重归一化=1/m,m 为样本数,然后调用弱学习算法进行 T 轮迭代,在每一轮的迭代中,弱学习算法的目标就是根据训练样本的权重产生一个弱分类器最简单的情况就是二值分类问题,即分类器性能的好坏由其误差率决定。


v2-8c6d85b980724a641171bb743d154914_b.jpg

(2.1)

每次迭代后按训练结果更新样本的分布,对训练误判的样本赋予较大的权重,也就是让学习算法在后续的学习过程中关注于这些分类困难的样本,再对重新分布的训练集进行学习。T 次训练结束后,AdaBoost 算法得到一系列弱分类器,,…,并给每个弱分类器赋予一个权重,,…,表示该弱分类器的重要性。

AdaBoost 算法是一种迭代方法,它是通过改变数据分布来实现的。它根据每轮训练中每个样本的分类是否正确,以及上轮的总体分类准确率,来确定每个样本的权重,然后将每次训练得到的分类器融合起来,作为最后的决策分类器。在AdaBoost 算法中,每一个训练样本都被赋予一个权重,表明它被某个弱分类器选入训练集的概率。如果某个样本没有被正确的分类,那么在构造下一个训练集时,它被选中的概率就会增加;相反,如果某个样本已经被正确的分类,那么在构造下一个训练集时,它被选中的概率就会降低。通过这样的方式,AdaBoost 算法能够“聚焦于”那些较困难的样本上。在具体的实现时,最初令每个样本的权重都相等,对于第 t 次迭代操作,就根据这些权重来选取样本,进而训练分类器 。然后就根据这个分类器,来提高被它错分的那些样本的权重,并降低被正确分类的样本权重。然后,权重更新后的样本集被用来训练下一个分类器 。整个训练过程如此循环下去。理论证明:若每个弱分类器的分类能力比随机猜测好,那么当弱分类器的个数趋向于无穷时,强分类器的错误率将趋近于零。

对于二值分类问题,已知训练样本集(),…, (),,,待分类样本有k 个简单矩形特征,表示为,其中。对于第 i 个样本,它的特征为,,…,,对每一个输入特征有一个简单的二值弱类器。第 j 个特征的弱分类器由一个阈值、一个特征和指示不等式方向的偏置构成

(2.2)

可以看到,一个较低的阈值可以产生一个高检测率的分类器,但它的误识率也相应很高;相反,较高的阈值可以产生一个低检测率、低误识率的分类器。AdaBoost 算法构建强分类器的具体过程如下:

  1. 对所有样本初始化权重。

(2.3)

  1. 经过 T 轮迭代训练,挑选出 T 个弱分类器组成强分类器。
  2. 最后得到的强分类器为

(2.4)

其中

v2-cf3c48b8748739c3c9b3fd47d2a3cfe2_b.jpg

为弱分类器的投票加权重。

以上过程的意义可以简单的表述为:每一轮迭代过程在当前的概率分布上找到一个具有最小错误率的简单分类器,然后调整概率分布,增大当前简单分类器分类错误的样本的概率值,降低当前简单分类器分类正确的样本的概率值,以突出分类错误的样本,使下一次迭代更加针对“困难”的样本,使得那些被错分的样本到进一步重视,后面训练得到的新的简单分类器就会更加强化对这些分类错误样本的训练,这样经过多次迭代之后,产生的每一个新分类器基本上可以解决已有分类器不能很好分类的样本。从而得到一个弱分类器序列,每个弱分类器赋予一个权重,分类效果好的相应权重就大。T 轮迭代后,最终的强分类器采用带权重的投票法产生。

2.3 AdaBoost算法分类器

由 AdaBoost 算法的收敛性能分析可以看出,通过增加 AdaBoost 算法中迭代次数T 可以使得最终强分类器的分类误差尽量的小。然而,随着T 值的增加,强分类器中所包含的弱分类器的数目也不断增加,就使得检测过程中的计算量增加。例如利用一个具有数百个弱分类器组成的强分类器进行检测的时候,需用所有的弱分类器对图像的每一个子窗口都检测,这大大的降低了检测的效率,因而很难达到实时应用目的。为了减少计算时间,提高检测效率,可以构造分层的分类器,其主要思想是:设计一个规模小的、效率高的、逐步渐进的分类器,使得该分类器在搜索过程中能拒绝大多数的负样本。这种设计是逐级提高检测精度,前面几级使用的特征数目较少,结构较简单,主要进行非目标的排除,后面的弱分类器特征数目越来越多,检测精度越来越高,由于需要检测的子窗口越来越少,从而能够显著地提高检测的速度,以满足实时系统的要求。

2.3.1 分类器级联策略

一个典型的Adaboost训练算法可以被简单的看成是对特征进行贪心选择的过程。一个简单的boosting问题包含了非常多的弱分类器,这些弱分类器通过加权投票被组合在一起,经过T次迭代后,获得了T个最佳弱分类器,当这个强分类器对一幅图像待检测时,相当于让构成该强分类器的所有弱分类器投票,再对投票结果按照弱分类器的错误率加权求和,将投票加权求和的结果与平均投票结果比较得出最终的结果。

输入人脸样本

被排除的样本

图2.2 多分类器级联结构

2.3.2 级联分类器误差分析

由级联分类形式和构造过程可看到,对于一个已经训练好的级联分类器,它的误识率是:


(2.5)

检测率是:

v2-ee12b23d7727d691b94318842c4b04ba_b.jpg

(2.6)

N 为分类器的层数,

v2-f08efc6cbae4202b0f2b9ed0d919f878_b.jpg

是每层分类器的误识率,

v2-91a0d8dc763749d2c53fc4974fd14eaa_b.jpg

是每层分类器的检测率。由以上两个公式可以看出,整体的检测率和误识率可以通过设定多层分类器的各个阶段的检测率和误识率来达到。比如最终检测率 0.9 可以用 10 层,每层的检测率为 0.99 的分类器得到 0.9≈

v2-84d2b37d4c895f6c60a853d1fd10d0b2_b.jpg

。每层的检测率相当容易达到。而每一层的检测率和误识率在该层分类器的学习过程中达到,如果该层分类器不能够排除足够的反例,则增加分类器的个数并重新进行分类器的学习直到达到要求为止。

同时可以发现,如果增加级联的层数,虽然能够减小误识率,但是相应的检测率也会降低,使得许多正样本被错误剔除,而且还会增加检测的时间,因此不可能无限的增加级联分类器的层数。另外,由式(2.2)可以看出,适当的降低阈值能够提高检测率,但同时仍然会增大误识率,因此无论是增加级联分类器的层数还是降低阈值,都无法同时提高检测率而又降低误识率。这也是制约 AdaBoost算法在疲劳检测系统中应用的一个重要问题。针对这个问题,将会在第 3 章中进一步讨论。

3 人眼定位技术

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

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

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

本系统首先从视频帧中提取出人脸,再在人脸区域上搜索人眼,进行眼睛区域的定位。由于人脸检测和人眼检测的实现原理基本一致,因此本章接下来将主要以人眼检测为例进行阐述。本文使用 Haar-Like 特征作为分类特征,该特征可以利用积分图像进行快速计算,最后将训练得到的弱分类器进行组合就得到了最终的分类器。

3.1 常见的几种人眼检测方法

人脸识别一直是计算机视觉研究的热点和难点,眼睛作为脸部特征的重要组成部分,往往被研究人员作为一种人脸识别中重要的依据。一种快速、准确的人眼检测算法不仅可以提高检测和识别的速度,还能够降低识别算法的复杂度,提高人脸检测的实时性,而且在基于视觉的疲劳检测领域中,通常利用人眼信息来判断驾驶员的疲劳程度,从而发出警报,提醒驾驶员。因此,人眼检测对于疲劳检测后续的眼部状态识别和疲劳判断至关重要。目前,人眼定位主要有基于几何特征、基于模板匹配、基于统计学习的方法。

基于几何特征的方法:人眼在脸部中位置特征较为明显,如眼睛在人脸中的位置和两眼间的距离一般是一个固定的常数。正常情况下,人眼具有明显的对称性、眼睛与其他人脸局部特征(如眉毛、鼻子)的相对位置、人眼特定的几何形状都可以用来对人眼进行定位。虽然基于几何特征的人眼检测方法,充分利用了人脸面部的几何特性,对一些背景简单的正面人脸图像具有较好的检测效果,但这种几何特性对人的姿态和光照要求很高,仅仅使用这种法难以获得理想的检测效果。因此,基于几何特征的方法,一般是作为一种辅助方法与其他方法结合进行人眼定位。

基于模板匹配的方法:该方法将眼部模型进行函数参数化,在检测时,在图像搜索区内逐点平移眼睛参考模板图像,根据某个相似性准则来计算待检测图像某一位置区域和参考模板的相关值,然后根据相关值来判断此区域是否人眼,相关值在设定的标准内就判定该区域为人眼,否则非人眼。模板匹配的方法对背景比较简单、脸部特征较规整的图像能够进行有效的人眼检测,但是该方法计算量大,实时性差,而且由于眼睛的个体差异性,所建立的模板很难满足不同人眼的需求,导致检测结果不是最优,在通用性方面受到了很大限制。

基于统计学习的方法:该方法通过对大量人眼样本和非人眼样本进行训练学习得到一组模型参数,根据模型来构建人眼分类器。在使用时,利用训练好的分类器对输入图像逐区域进行扫描完成人眼检测。这种方法具有较高的准确率,已越来越多的进入人眼检测的研究和应用中。在众多的统计方法中,以 AdaBoost算法应用最为广泛,该方法鲁棒性好、漏检率较低,虽然计算量很大,但是在实际检测中采用 Haar-Like 特征和级联的结构,使检测速度大大提高。

在驾驶疲劳检测系统中最为关键的要求是非接触式、实时性、高准确率。考虑以上方法的特点,为解决眼睛定位的实时性、准确性问题,本文采用较为成熟的基于统计学习方法中的 AdaBoost 算法进行驾驶员人脸检测和人眼定位。



3.2 矩形特征及积分图

Viola等在2001年提出一种基于Boosting方法的实时人脸检测系统,该系统的检测速度可以达到每秒15帧,实时检测速度及检测准确率表现优异,这是人脸检测从研究走向实用的一次质的飞跃。他们对人脸应用积分图方法计算矩形特征,用其得到的结果训练分类器。

3.2.1 矩形特征

(1)Haar-like特征

Haar-like特征是Viola等提出的一种简单矩形特征,因其类似于Harr小波而得名。Haar-like特征的定义是黑色矩形和白色矩形在图像子窗口中对应的区域的灰度级总和之差,可见,它反映了图像局部的灰度化。Viola等用到的Haar-like特征总共有三类,如图3.2所示,其中第一行属于二矩形特征,第二行左边一个属于三矩形特征,右边一个属于四矩形特征。每个图像可得到用于训练的Haar-like特征超过18万个,但是实际上不一定需要这么多,因为过多的特征会加大训练过程的时间和空间复杂度,实际上过细的特征中会引起过多的冗余,所以在选择特征时可适当放粗一些。


v2-7a1fe940b2e0a7c8b89991a05c64868d_b.jpg


图3.2 四种矩形Haar-like特征

(2)Walsh特征

离散沃尔什变换(DWT: Discrete Walsh Transform)是数字信号处理方面经常采用到的一种正交变换,并且该变换同离散傅立叶变换一样,可以很好的反映数字信号的频率变换情况,而且变换矩阵只是由±1组成,可以较大程度减少计算量。

由于所有m n维的Walsh特征算子都相互正交,这意味着它对图像某个局部特征的提取不产生冗余,并且特征算子的形状比Harr-like特征算子的形状要丰富。另外,m、n都要求是2的整数次方,所以对一幅训练图像而言,它的全部Walsh特征数是有限的,即Walsh特征的数量小于Harr-like特征的数量。实际Harr-like特征提取过程中,很多特征都非常相近,冗余很大,采用Walsh特征来代替Harr-like特征可以大大降低特征之间的冗余。

(3)Gabor特征

从人脸图像中提取特征的类型很多,如:几何特征、边缘特征、PCA特征、小波特征、Gabor特征等,相比于其它特征,Gabor特征因其滤波器的脉冲响应函数与哺乳动物的视觉皮层中简单型细胞对图像信号的响应非常相似,故可以对人脸图像做出多尺度、多方向的描述,并且具有很强的刻画细节与局部结构能力。同时,Gabor滤波器的带通滤波的特性还能去除图像中高频噪声。与小波变换类似,利用Gabor变换也可以对图像做多分辨率分析,由于人的视觉系统具有对数频程性质,在对Gabor小波展开时也通常采用在频域或者空间域上的非均匀采样方法。常用的方法是,对的Gabor滤波器取一系列以固定倍数增长的波长和间隔的方向,构成多角度、多方向的Gabor滤波器组。当利用Gabor滤波器组提取图像的特征时,通常以滤波器的输出响应的实部绝对值或者幅值作为Gabor特征。

3.2.2 积分图

2001年,Viola等提出积分图(Integral Image)概念,其目的是为了快速的计算分类器所需的矩形特征。若定义一幅图像的像素灰度为i(x,y),则某像素处的积分图像值定义为

(3.1)

v2-8346c69b65abed31b6635b11329884aa_b.jpg


要得到一幅输入图像I的积分图像,只需逐点扫描原图像一次,就可计算出来。


v2-7721425aaca360622d3bac2a0a5341a6_b.jpg

(3.2)


v2-fa261fddaa6ec77db1b01df59ebca706_b.jpg

(3.3)

其中,s (x, y)为点(x ,y)所在位置的行列积分值。

如此,两个矩形内像素和的差可以由积分图上的六个点计算得到,而三个矩形内像素和的差可以由积分图上的八个点计算得到。如图3.3,先扫描图像求出各点像素值,则灰色区域像素值的和可以由(5+1-2-4)得到,下半部分区域像素值的和为(2+6-3-5),则该矩形Harr-like特征值为两式之差,即(5+1-2-4-2-6+3+5)


v2-95aaa016c9eb382baffd19e63d63925f_b.jpg


图3.3 求矩形特征像素差示例

Harr-like特征主要有三类,如图3.2所示。a与b的矩形Harr-like特征为两个矩形内像素灰度值分别求和之差的,c的矩形Harr-like特征为两边矩形框的灰度值之和减去中间矩形的灰度值之和,d矩形Harr-like特征为两条对角线的矩形框的灰度值和的差值。

3.3 AdaBoost算法的改进

在基于统计学习的检测算法中,AdaBoost 算法是主流的方法,经过几年的发展,基于 AdaBoost 的人脸检测算法取得了很大的成功,检测率已经达到很高的水平,而且可以达到实时检测,本文的算法就是基于此算法。在 2.2 节中对 AdaBoost 算法有过介绍,在训练过程中,所有的正负样本都被赋予一个相等的初始权重,当某一轮分类器训练完成后,会根据其在训练集上的分类结果和总体的分类准确率来调整样本的权重:在下一轮迭代时,本轮分类错误的样本的权重增加(概率增大),本轮分类正确的样本权重降低(概率降低),使得在下一轮迭代时,弱分类器更加关注分类错误的样本。也就是说随着训练迭代次数的不断增加,AdaBoost 算法的重心将逐渐地转移到较难分类的样本上,然而该算法对于这些较难分类的样本中的正负样本并没有针对性的加以区分。另外,随着迭代次数的增加较难分类样本的权重不断扩大,而曾经已经分类正确的样本的权重越来越小,当较难分类样本的权重过度扩张后,分类正确的正样本比例严重下降,会导致算法的检测率降低。并且 AdaBoost 算法的一个重要指标就是对正样本的识别率,对于较难分类的样本,正确识别正样本的价值要远超过正确识别负样本的价值。

为了减缓较难分类样本权重的过度扩张并提高对正样本的识别率,本文提出一种新的样本权重更新方法,在保证传统 AdaBoost 算法偏重难分类样本的基础上,对于被误判为负样本的正样本赋予更高的权重,使得算法更加关注于难分类样本中的正样本,以提高对正样本的检测率,同时融合弱分类器的动态投票加权值,进一步提高检测率、加快算法的收敛。改进的算法流程为:

进行 T 轮迭代训练,挑选出 T 个弱分类器组成强分类器。

(1)归一化样本权重,使样本权重能够代表样本的出现概率


v2-a53f09a7911a02eee81c50621b7b7876_b.jpg

(3.4)

(2)对每个特征 j ,训练一个弱分类器

v2-44286dc400da9c6b5e2d1d33e5510d58_b.jpg

,计算其加权错误概率


v2-dbc1f5771838a99a9c19ede6749f5e84_b.jpg

(3.5)

(3)遍历所有特征和弱分类器,找出一个具有最小加权错误率的弱分类器,记错误概率为;

(4)计算识别正确的正样本的权重和


v2-8d5a29841bc352316dbf8121dddf5ffa_b.jpg

(3.6)

求解弱分类器的投票加权


v2-84a58bfa79b15223daa1db9da2f5e56c_b.jpg

(3.7)

其中为常数,一般取

v2-3a89df426a5e063b942885db09d10536_b.jpg

,s为所有正样本的权重和;

(5)为下次迭代更新样本权重


,显然,改进后的 AdaBoost算法既保留了传统算法强化困难样本的学习规则,同时更加关注困难样本中的正样本,从而减缓了困难样本中的负样本权重的过度扩张。由于困难样本中的正样本权重比负样本的权重增加的快,当权重归一化后,在下一轮迭代过程中,其概率将变大,这就保证了正样本在训练过程中能够得到更多的重视,从而有利于提高正样本的识别能力。

在引入新的弱分类器投票加权中,

v2-d345cca009dc40b0a7ed537f65bf3812_b.jpg

代表了弱分类器对正样本的识别能力,

v2-c5f4768c0c34986ffd8914d4452b471f_b.jpg

v2-d345cca009dc40b0a7ed537f65bf3812_b.jpg

的递增函数,

v2-d345cca009dc40b0a7ed537f65bf3812_b.jpg

越大,说明选择的弱分类器对正样本的识别能力越强,

v2-0a9500d8b2c65dcc199e77d93134275c_b.jpg

也就越大,在错误率相同的情况下,对正样本具有更强识别能力的弱分类器就具有更大的投票权重,从而能加快训练过程的收敛,并提高检测的精度。

3.4 构建双层AdaBoost分类器进行人眼检测

通过以上分析可见,Viola 用于人脸定位的方法同样可以用于人眼定位,只需在训练样本时将人脸样本图像替换为人眼的样本图像即可,其他步骤均可按照人脸定位的步骤进行。

3.4.1 人脸定位与人眼定位的差异

在本章的开始介绍了疲劳检测系统的第一步是人脸的定位(图 3.1),虽然可以采用 Viola 的方法像人脸检测那样,训练一个人眼分类器来进行人眼定位,但是一般不像人脸检测一样直接在待检测图像中定位人眼。直接对整个待检测图像进行人眼定位是具有可操作性的,但是在实际检测时往往会发现人眼的误识率明显高于人脸的误识率。

在现实生活中,类似人眼的物体很多,要构建一个能可靠区分“人眼”和“非人眼”的分类器相当困难。人脸图像的边缘信息量一般高过人眼图像,这使得人脸图像在训练中能够和复杂背景图像构成的负样本保持更高的区别度。而人眼图像的边缘信息量相对较少,其中闭眼图像的边缘信息量相对于睁眼图像又略微低一些,使得人眼图像,特别是闭眼图像与复杂背景图像在训练过程中较难以分辨。此外,还有其他因素使得人眼的定位难于人脸定位,例如因为人眼区域小于人脸区域,对于一些清晰度不高的视频采集设备,往往得到的人眼区域图像比较模糊,直接在图像中实施人眼检测会因为目标过小致使精度不高。

3.4.2 人眼定位预处理

在定位好了人脸以后,接下来的工作就是试图在人脸区域中检测到人眼区域。要在整个人脸区域进行人眼检测,计算量还是比较大的。如果在人眼检测前能利用某种方法进一步的缩小人眼检测的候选区域,把人眼检测的搜索区域降低到更小,那么就能为接下来的检测工作节省计算量,提高搜索速度。衡量一个人的脸部是否美观有一个“三庭五眼”标准,这个“三庭”就是从发际线到眉间连线、从眉间到鼻翼下缘、从鼻翼下缘到下巴尖,上中下各占整个面部的三分之一,如图 3.4 所示。


v2-822d75487236c4867a9db0cdd36fa55e_b.jpg


图 3.4 人脸的“三庭”标准图

这样,当定位好了人脸区域以后,就可以通过“三庭五眼”标准设定眼睛区域的大致范围,最后利用训练好的人眼分类器,在该区域内搜索人眼。这种通过构建双层分类器缩小区域搜索的方法可以快速的定位出眼睛,提高系统的检测速度,同时能极大地降低眼睛误识率,提高检测的精度。

3.4.3 人眼定位双层分类器的构建

双层 AdaBoost 分类器是人脸分类器和人眼分类器的级联过程。整个分类器由两部分组成:人脸 AdaBoost 分类器和人眼 AdaBoost 分类器。

首先,提取一帧视频图像,扫描图像进行人脸检测,此时采用较大的检测窗口,然后将已经标定的人脸区域按照“三庭五眼”的结构,进一步划分出人眼的大概区域,再将该区域送入人眼 AdaBoost 分类器,最后输出人眼部分。

双层 AdaBoost 分类器能有效抑制人眼误识率。由于人脸特征比较丰富且相对比较固定,因此利用 AdaBoost 算法对人脸样本进行训练时,通常可以使用高阈值而还能保证较高的识别率,因此人脸检测的误识率通常很低。这样就可以利用人脸检测的信息对人眼进行检测,排除人嘴和背景中误识的部分,从而可以在保持原有检测率的基础上有效地抑制误识率。

3.5 人眼定位算法的设计与实现

获取图像后,需要对图像灰度化,滤波除噪等预处理,然后就可以对人眼进行检测。人眼检测的流程包括积分图的生成、特征值计算、级联分类器判断等步骤。下面给出人眼定位实验结果,源程序见附录1。


v2-1584fa429988522fbd1b563b0c6db3c7_b.jpg







图 3.5 人眼定位检测结果图






4 人眼状态识别

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

4.1 基于椭圆拟合的人眼状态分析

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

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

其中

v2-716e3203655b9074f605a1265739bb47_b.jpg

为椭圆的中心坐标点,a是椭圆的长轴,b为椭圆的短轴,

v2-3e3e42cdd52f7c5d490b61f4694386ad_b.jpg

是长轴相对于水平坐标的偏转角。

因此,对人眼轮廓进行椭圆拟合后,就可以很直观的想到利用椭圆的长短轴的比来确定人眼的状态,即通过

v2-228c3b7d33c65c9bf220776b38d8f4cf_b.jpg

来判断人眼的睁闭状态。通过实验分析发现,当

v2-75910b718995d7b7251d5b4bd1c9e796_b.jpg

时,可以认为眼睛处于睁开状态,否则眼睛处于疲劳状态的半闭合状态或完全闭合状态。

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

表 5.1 人眼状态识别结果

测试集测试1测试2测试3
正确率%91.6084.2390.52


v2-ea6eec39e3afa9339c2337ed73a1f512_b.jpg

v2-420cba3a6b27400474f4940e80351186_b.jpg

v2-684fef9fd0bdd07c7ab86f0420aaa8b9_b.jpg





v2-35f121214fd61cfcd45abf3b4b8ff796_b.jpg

v2-fb41d7ce3d35fa50eeb04e6f6c08dff9_b.jpg

v2-eb2a865bd8053578ad2f7fbe943ebf4a_b.jpg




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

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





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

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

5.1 PERCLOS方法介绍

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


v2-52164d27f1de62f2109abdd99dce8991_b.jpg










图 5.1 驾驶员眼睛睁开度图

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

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

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

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

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


v2-8b90e84265ab27656784f08dcb275c8d_b.jpg

(5.1)

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

6 总结

近年来由疲劳引发的交通事故越来越多,疲劳驾驶预警系统对于避免交通事故实现道路安全有重要意义。本文通过使用计算机视觉的方法对驾驶员进行眼睛定位和状态分析,分别研究了人脸检测、人眼定位和眼部状态识别几个方面的内容,然后融合 PERCLOS来判断驾驶员是否处于疲劳状态。

本文首先介绍基于 AdaBoost 算法的人脸检测技术,结合 Haar-Like 特征分析了其实时检测方面的优点,并针对 AdaBoost 算法对困难样本不加以区分的问题,采用一种结合正样本识别率的方法对权重更新进行了改进。在比较了各种人眼检测方法后,采用基于 AdaBoost 算法构建双层分类器进行人眼检测,这种方法先检测到人脸区域,然后根据人脸的“三庭五眼”结构缩小人眼搜索的区域,能够排除大部分被误识的非人眼区域。

在对人眼成功进行定位以后,采用了基于最小二乘法的眼睛轮廓椭圆拟合方法,用所拟合的人眼椭圆来表示人眼的形状特征,然后根据拟合椭圆的长短轴比例来判断人眼的睁闭状态。最后采用结合 PERCLOS的方法判断疲劳状态,使得疲劳检测系统更加的稳定。

参考文献

[1] 林广宇,魏朗.基于数字图像的汽车驾驶员行驶状态判别[J].计算机工程,2007,33(22):193-194.

[2] 梁路宏,艾海舟,基于人脸检测的人脸追踪算法.计算机工程与应用,2001.17: 42-45

[3] 吴康华.基于 PERCLOS 的驾驶疲劳检测系统设计[D].杭州:浙江大学信息学院,2008

[4] 张劲.安全驾驶中的人脸表情识别技术研究[D].南京:南京理工大学计算机应用专业,200

[5] 贾永红.数字图像处理[M].武汉:武汉大学出版社,2003

[6] 朱振华 , 吴晓娟 , 王磊 , 等 . 基于眨眼持续时间的司机疲劳检测方法 计算机工程,2008:34(5):201-206

[7] Li Ying, Lai Jianhuang, Ruen Pongchi. Muti-template ASM and Its Application in FacialFeature Points Detection. Computer Research and Development,2007,44(1):133-140

[8] Gerry E.Warning system for fatigued drivers nearing reality with new eye dataf[J]. Seienee Dai]y Agazine, 1997, (7): 25-30

[9] 王荣本,郭克友,储江伟.适用驾驶员疲劳状态监测的人眼定位方法研究[J].公路交通技术2,003,20(5):111-114

[10] 夏芹, 宋义伟, 朱学峰. 基于PERCLOS的驾驶疲劳监控方法进展[J]. 自动化技术与应用,2008, 27(6): 43-46

[11] 郑培. 机动车驾驶员驾驶疲劳测评方法的研究[D]. 北京: 中国农业大学, 2001

[12] Ma Y, Xiaoqing Ding. Robust precise eye location under probabilistic framework[C].Proceedings of the sixth IEEE International Conference on Automatic Face and GestureRecognition, 2004: 339-344

[13] Freund Y. Boosting a weak Learning Algorithm by Majority[J]. Information and Computation,1995, 121(2):256-285

[14] M. Pilu, A. W. Fitzgibbon, R. Fisher. Ellipse-Specific Direct Least-Square Fitting[C]. PatternAnalysis and Machine Intelligence, 1999: 599-602

[15] R. Lienhart, A. Kuranov, and V. Pisarevsky. Empirical analysis of detection cascades ofboosted classifiers for rapid object detection. [C] In DAGM 25th Pattern RecognitionSymposium, 2003.

附录A

clear all

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

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

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');

%最大类间方差定二值化阈值

[height,width]=size(z);

hist=zeros(256,1);%直方图

%threshold=128; %初始阈值

%计算直方图

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

if m<T_current

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

else

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

end

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');

  • 6
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值