检查功能是否支持
在开启人脸检测功能之前,必须检查一下该摄像头是否支持人脸检测,通过接口:
代码语言:javascript复制// 如果返回0,则表示不支持
Parameters#getMaxNumDetectedFaces()
开启/停止人脸检测
开启和停止人脸检测都是直接调用Camera对象提供的接口即可,使用起来是非常简单的,需要注意的是两个接口需要在预览期间调用,即启动预览后才能开启人脸检测,停止预览前关闭人脸检测
从源码中可以看到两个接口必须成对出现,连续调用startFaceDetection是会出现异常的。而且默认的检测方式为:
代码语言:javascript复制 /**
* Hardware face detection. It does not use much CPU.
*/
private static final int CAMERA_FACE_DETECTION_HW = 0;
开启人脸检测功能后,会导致手动白平衡,手动对焦区域和测光区域的设置无效,因为此时Camera会基于识别到的人脸做自动白平衡,自动曝光和自动对焦处理。
在相机类app中,可以观察到在手动对焦和拍照的时候会停止绘制人脸框。
因为在调用autoFocus方法的时候,Camera会停止发送人脸检测的回调,当对焦完成或者调用cancelAutoFocus之后,人脸识别的回调才会继续。
拍照期间会停止预览,所以也不会有人脸的回调,在拍照结束,调用startPreview后,还必须再调用一次开启人脸检测的方法来重新进行人脸检测
人脸识别回调
通过向Camera注册FaceDetectionListener,可以获取到检测的人脸结果
通过Face对象,可以获得当前预览帧识别到的人脸信息,包括人脸区域,可信度评分,左右眼睛和嘴巴的坐标点等
代码语言:javascript复制Face#score表示人脸识别的可信度,值为[1, 100],
值越高,可信程度越高,在多张人脸的场景下通常都需要过滤掉评分比较低的结果
通过此接口拿到的人脸区域是基于sensor的坐标系,要在UI上绘制人脸框的时候,还需要转换一波,计算过程大致如下:
DEMO
绘制效果如下:
代码语言:javascript复制 https://github.com/sifutang/Camera1Demo.git