Android Camera1中的人脸检测

2020-08-05 14:51:57 浏览数 (1)

检查功能是否支持

在开启人脸检测功能之前,必须检查一下该摄像头是否支持人脸检测,通过接口:

代码语言: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

0 人点赞