Android人脸检测方案分析以及使用
来源:互联网 发布:俄罗斯域名注册商 编辑:程序博客网 时间:2024/06/01 08:44
**Android人脸检测方案分析以及使用**
1 案例简述
最近在做项目时使用到了本地手机客户端对人脸进行检测,并且根据特定的要求对检测出的人脸照片做选择性筛选上传,前期做了很多的预研,总结分析了一下现在市面上Android人脸检测基本上有四大类:
1. Face++,是一个第三方的sdk,优点是对人脸检测以及识别都有比较深的研究,检测识别率很高,性能也比较高,对于需要精密的检测识别的app可以选择,但缺点是这是一个收费的sdk。接入后必须缴费才可以使用它的API。
2. OpenCVforAndroid这是一个机构出的一系列人脸检测以及识别的第三方库,包含提供给全平台的使用,不a仅仅是提供客户端。优点性能还算比较高,而且免费,缺点是需要导入的第三方库太过于庞大,而且很多高级的功能我们仅仅只是做检测功能时用不到的,集成起来也比较麻烦,对手机性能消耗也比较大。
3. Google vision 据说是Google新的人脸识别库,但是缺点比较明显就是只能在含有GMS的Android设备上运行,所以就没有深入的研究。
4. Android原生FaceDetector,这是在Google很早就引入在了AndroidSDK中,使用起来非常简单,对手机性能消耗也非常小,相较于前面几个最大的优点也就在于使用简单,检测人脸的识别率还是能满足普通的需求,如果不是对检测有相当高的要求的话可以使用Android原生自带的,毕竟系统上的对于机型众多的Android手机肯定是适配率比较高的。
2 案例使用分析
本次我们就项目中用到的Android原生FaceDetector进行分析以及使用。Android的人脸检测主要通过Camera类以及人脸检测类FaceDetector配合起来进行动态的人脸检测,我们先来看看两种人脸检测的方法的优缺点:
(1)直接使用Camera回调检测
直接从camera接口中预览获取到的人脸检测的数据代码如下,
可以看见在用于显示预览视图的surfaceView创建之后,就是进行Camera摄像头的初始化,其中包括预览的分辨率以及镜头旋转角度使用前置还是后置摄像头等,然后startPreview开启预览,紧接着就是开启faceDetection开始人脸检测,开启之后摄像头会捕捉镜头内的人脸进行检测,一旦检测出人脸会在回调函数中返回信息,返回的信息是一个数组,其中包括检测出的人脸部分信息代码如下:
这个函数就是人脸检测出来之后的回调,这里的Camera.Face[]数组就是检测出的人脸信息的数组这个数组中信息包括一个rect类,也就是检测出人脸矩形的坐标系,通过这个坐标系我们可以画出一个矩形框来跟随人脸移动,在页面上显示出检测出人脸的效果,但是这里有个问题,检测出来的人脸很多时候需要瞳距满足一定的大小。这里的瞳距是提供给人脸识别使用,瞳距太小即使检测出人脸也没办法进行识别,我们可以看见Face[]数组中的每一个对象除了rect参数以外都有一个eyedistance,也就是瞳距,但是打印会发现所有的eysdistance都是为null,因为这个回调方法的检测只是最基本的检测没有更进一步对瞳距也进行检测,不然也不会这么快速以及高效的检测。
(2)FaceDetector类进行检测
如果需要检测出瞳距则需要调用真正的检测类FaceDetector,这个类可以对人脸信息进行详细的检测,还是先以代码来分析:
可以看见这里是在上一个回调函数检测出人脸之后立马调用Camera的拍照功能对预览界面进行拍照,然后将照片格式转化为BitMap传入到FaceDetector类中,之后调用faceDetector.findFaces(bitmap,mfaces)方法得出照片中的人脸个数,如果不为0表示有人脸信息,然后在faces[]数组中可以调用eyesDistance()获取瞳距,这个时候的瞳距获取到的才是真正的有效值,但是你会发现faceDetector类的findFaces只接受BitMap类型,所以我们采取的是拍照的方法将 图片转换为BitMap类型,但是这样会有体验上的卡顿感因为会调用拍照功能页面会卡一下,而且不可能一直不停的连续调用拍照功能,有没有方法可以直接在预览时就获取到BitMap进行检测呢,这里查阅方法Camera有个回调方法可以获取预览的帧数据,这个其实也就是一个实时的图片数据可用使用来进行检测,
这样就可以对之前使用的拍照然后转换照片为BitMap的方法进行很大的改进,代码如下:
我们可以看见MyPreviewCallback方法就是帧数据的回调方法,返回一个byte[]数组,我们将这个byte[]数组传入到detectionFaces方法中转换为BitMap然后进行检测,检测方法和前面一样,这样就可以实时的进行带有瞳距检测的人脸检测了。到此就是人脸检测的完整版本了。
3 经验总结
本文介绍的人脸采集方法基于Android系统的SDK中的方法,对于人脸检测不是要求十分严格的情况下使用改方案是比较理想的,体积小,使用简单,兼容性高,使用SDK中的API也比较安全不会出现信息泄露的风险,所以还是比较推荐的。
4 参考文献
无