使用dlib,OpenCV和Python进行人脸识别—人眼眨眼检测

前期文章我们分享了如何使用python与dlib来进行人脸识别,以及来进行人脸部分的识别,

如下图,dlib人脸数据把人脸分成了68个数据点,从图片可以看出,人脸识别主要是识别:人眉,人眼,人鼻,人嘴以及人脸下颚边框,每个人脸的部位都有不同的数据标签从1-68

当我们识别出人脸的这68个点,可以通过访问不同的数据点来检测到人脸的部分数据

· 口可以访问 [48,68] 。

· 右眉可以访问 [17,22]。

· 左眉可以访问 [22,27] 。

· 右眼可以访问 [36,42]。

· 左眼 可以访问 [42,48]。

· 鼻可以访问 [27,35]。

· 下巴边框可以访问 [0,17]

通过访问不同的数据点,来进行人脸上的部位检测,要想对人眼眨眼检测,首先我们检测到人眼,下图可以看出人眼有6个数据点

人脸68点数据图

通过这6个数据点,可以来定位人眼的6个数据点的坐标,从下图可以看出当人眼睁眼时,人眼上的6个数据点的坐标与人眼闭眼时的数据点坐标不完全一样,通过计算6个数据点的坐标差异,便可以通过距离的计算来判断人眼是否眨眼了

人眼坐标

根据Soukupová和Čech在2016年的论文《 使用面部地标进行实时眼睛眨眼检测》,我们可以得出一个反映这种关系的方程,称为眼睛纵横比(EAR):

人眼纵横比公式

当检测到人眼时,通过实时计算人眼的纵横比,当人眼纵横比突然变小时,便可以通过此值来判断人眼眨眼了,也可以证明人脸不是照片

OK,有了以上的基本知识,就开始代码

导入第三方库

导入第三方库(1-9行)

定义一个函数,来计算人眼纵横比

计算两组 垂直 眼界标之间的距离(第13和14行)

计算水平眼界标之间的距离 (15行)

最终利用计算公式计算眼睛纵横比(16行)

定义人眼纵横比阈值(19行,根据自己人眼大小来设置)

定义检测到眨眼的帧数(设置为3,当3次检测到阈值小于设置值才算是一次正常的眨眼,也跟计算速度有关)

定义眨眼帧数与人眼眨眼数(23-24行)

加载人脸检测与68点数据模型(27-28行)

获取左右人眼的坐标参数值(31-32)

从视频中,或者摄像头中获取视频帧(35-39行)

从视频中获取图片帧进行人脸数据点检测(41-52行,本段代码是上期文章分享的内容,不再详细注释)

提取人眼坐标,来计算人眼纵横比(55-60行)

可视化人眼(62-65行)

通过计算出的人眼纵横比来跟设置的阈值来进行对比

当计算的人眼纵横比小于阈值时记录一次,当超过3次检测到人眼纵横比小于阈值时记录一次眨眼(67-74行)

在视频上显示人眼的阈值与眨眼次数(77-80行)

最后显示在视频中

人眼眨眼检测时人脸识别中很重要的一环,微信支付,支付宝支付很多时候需要识别是不是人脸或者是照片,通过人脸的眨眼检测,可以有效的来识别是否是正常的人脸,当然还有很多方法来检测是否是一个正常的人脸,比如现在超市的无人收银,让用户提供手机后4位,其实看是为了安全,其实也有这方面的考虑,小编是这样认为的,你觉得捏???