关于人脸检测被折磨了半个月,前2周开需求会时需要要做一个“人脸认证上传功能,具体是打开前置摄像头,识别出用户的脸并且脸在一个指定的圆圈内然后自动保存这个状态的图像待用户是否确定上传”。听到这个需求我第一时间想到比较专业的图形处理库OpenCV。去github上面搜了一下关于openCV识别人脸的demo,样例确实有点多,也确实是可以实现 但是OpenCV库实在是有点大8M,用这个库估计会被构架师说死。然后我还搜过其它的第三方库(虹软,face++,阿里云人脸检测)这几款都不是省油的灯一款需要兼容android5.0以上,其它2款都是收费版,至于阿里云更厉害了不支持离线检测。
后来才选择了google自带api,网上一搜发现google 的一个类android.hardware.Camera里面有已经帮你封装好的人脸检测的api有这方面了解的同学可以参考一下点击打开链接。我开始也是使用这种方式实现的,磕磕碰碰的写完后最终发现合乎需求,后来自己打算测试一下机子兼容性,拿了一台华为机子一测试,发现人脸的那个接口没有任何回调(nexus6P调用还会发现闪退,打log发现是ndk层抛出来的),心马上沉入谷底。
最后发现好像没有啥捷径可走了,只好老实实使用android.media.FaceDetector进行开发。这种方式的使用的思路是,使用Camera+TextureView(鉴于对开发时间紧,对已过时有点了解就没有使用Camera2)进行预览,通过设置PreviewCallback实时抓取每一帧图像进行检测是否合格。图像预览本人推荐google关于Camera使用demo进行修改,因为在实际中有很多机型未必都能合乎预想(本人也确实被坑过,自己封装的Camera发现跑在一些机子上图像方向是反向的。当然如果对Camera很熟悉那也是可以自己写的)。好了啰嗦了一大堆下面来看看正题
先看看集成到app里面的实际效果
这里说明不是APP卡,我用的录屏软件共享桌面时一卡一卡的
首先图像预览改自google demo,demo拿过来是不能直接使用的,里面需要自己手动添加每一帧的回调,代码如下(这里直接贴图了,更直观,稍后我会把demo发出来)
google CameraDemo主要改了这么多,下面来看看在获取到每一帧时对图像的处理跟识别
再看看FaceThread做的Bitmap转换,Bitmap旋转及对Bitmap是否有人脸的识别
好了,主要逻辑就这些吧,关于FaceDetector具体使用,这是我写好的demo(上面演示是把demo验证没问题情况拷贝到项目中,最终实现需要按照你的需求来。演示地址)
最后给一个忠告,在开发中遇到完全不熟悉的api最好去找google的实现的demo看效果,看代码的实现。