人脸识别过程:人脸拍照,照片传给平台,平台进行人脸比对,返回比对结果。下面将介绍人脸识别的每个过程
1 人脸拍照
人在摄像头前面走,摄像头会把每一帧的数据传给人脸识别SDK,SDK会根据每一帧的数据绘制人脸框并返回人脸信息(faceInfo),当返回的人脸信息的质量分数超过给定的分数,就可以调用相机进行拍照,拍摄好的照片上传到平台。
1.1 相机拍摄及预览
摄像头拍摄的数据一帧帧的显示到屏幕上,主要包括两个步骤,步骤一相机拍摄,步骤二预览帧的显示
(1)相机拍摄
下面从零开始介绍相机拍摄,最后再给出具体的实现代码。
开启相机: mCamera = Camera.open(mFrontCameraId); mFrontCameraId表示相机的id,例如前置摄像头id为1,后置摄像头id为2.
/**
* 开启指定摄像头
*/
private void openCamera() {
if (mCamera != null) {
throw new RuntimeException("相机已经被开启,无法同时开启多个相机实例!");
}
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
if (hasFrontCamera()) {
// 优先开启前置摄像头
mCamera = Camera.open(mFrontCameraId);
} else if (hasBackCamera()) {
// 没有前置,就尝试开启后置摄像头
mCamera = Camera.open(mBackCameraId);
} else {
throw new RuntimeException("没有任何相机可以开启!");
}
}
}
关闭相机: mCamera.release();
/**
* 关闭相机。
*/
private void closeCamera() {
if (mCamera != null) {
mCamera.release();
mCamera = null;
}
}
根据 ID 获取 CameraInfo:
@Nullable
private Camera.CameraInfo mFrontCameraInfo = null;
private int mFrontCameraId = -1;
@Nullable
private Camera.CameraInfo mBackCameraInfo = null;
private int mBackCameraId = -1;
/**
* 初始化摄像头信息。
*/
private void initCameraInfo() {
int numberOfCameras = Camera.getNumberOfCameras();// 获取摄像头个数
for (int cameraId = 0; cameraId < numberOfCameras; cameraId++) {
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
Camera.getCameraInfo(cameraId, cameraInfo);
if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
// 后置摄像头信息
mBackCameraId = cameraId;
mBackCameraInfo = cameraInfo;
} else if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT){
// 前置摄像头信息
mFrontCameraId = cameraId;
mFrontCameraInfo = cameraInfo;
}
}
}
CameraInfo包含如下信息:
-
facing
摄像头的方向,可选值有 Camera.CameraInfo.CAMERA_FACING_BACK 和Camera.CameraInfo.CAMERA_FACING_FRONT。
-
orientation
摄像头的画面经过顺时针旋转多少度之后是正常画面,这个属性比较难以理解,我们在后面会专门解释。
-
canDisableShutterSound
是否支持静音拍照,也就是说在用户拍照的时候是否会“咔嚓”一声,例如在日本由于隐私政策,所有手机都是不允许静音拍照的,那么该字段就会返回 false。该字段一般配合 Camera.enableShutterSound(boolean) 使用,当它返回 false 的时候,即使你调用 Camera.enableShutterSound(false),相机在拍照的时候也会发出声音。
(2)预览
介绍预览之前,需要先介绍几个概念:
分辨率
由于不同厂商对相机的实现都会有差异,所以很多参数在不同的手机上支持的情况也不一样,相机的预览尺寸也是,所以接下来我们就要通过 CameraCharacteristics 获取相机支持的预览尺寸列表。所谓的预览尺寸,指的就是相机把画面输出到手机屏幕上供用户预览的尺寸,通常来说我们希望预览尺寸在不超过手机屏幕分辨率的情况下,越大越好。另外,出于业务需求,我们的相机可能需要支持多种不同的预览比例供用户选择,例如 4:3 和 16:9 的比例。由于不同厂商对相机的实现都会有差异,所以很多参数在不同的手机上支持的情况也不一样,相机的预览尺寸也是。
图