使用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位,其实看是为了安全,其实也有这方面的考虑,小编是这样认为的,你觉得捏???