最近研究活体检测,主要是针对防止身份证照片攻击,通过提示用户完成某些动作进行识别;
想要检测用户的动作,最基础的一个前提,必须将人脸的特征点提取出来,才能做之后的判断;opencv自带的方法貌似只能画出矩形的人脸框,我们必须要准确检测出眼睛鼻子和人脸的轮廓,从网上找了两个人脸特征提取库:
1.IntrafaceDll
2.libfacedetect
两个库的共同点是,都能提取人脸68个关键点,这对我们的检测提供了很有利的条件;
也各有利弊,IntrafaceDll提取相对准确,尤其是针对眨眼,张嘴等动作时,相当灵敏,但是当前网上我只找到了lib库,没有找到源码,其只支持opencv246版本(和我的项目冲突);libfacedetect对于眨眼并不灵敏,张嘴效果还行,主要是引入方便,兼容性好;
好,提取68个点之后,效果大概是这样:
好,现在我说一下活体检测的思路把,
第一个张嘴,首先要找出嘴巴上下左右嘴唇的位置,通过上下的绝对距离/左右的绝对距离,得到一个比例,设定一个阙值,大于此值时,为张嘴,小于则为闭嘴;
眨眼,和张嘴的逻辑一样,不过要分左眼和右眼;
摇头,检测左右脸的晃动,需要三个点,鼻子,脸最左位置,脸最右位置,鼻子到左绝对距离为left,到右绝对距离为right, 总距离记为w=left+right; 当left<w/3 则判定为向左晃动,right>w/3则判断为向右晃动,其他情况 为正脸;
以上是我通过实验总结出来的几种方法,效果比较理想,代码这里就不贴了,毕竟原理最重要