人脸识别详细教程

本文详细介绍了人脸识别的过程,从人脸拍照到照片上传平台进行比对。重点讲解了人脸拍照的步骤,包括相机开启与关闭、相机拍摄与预览的细节,特别是预览时的分辨率和方向矫正。此外,还探讨了SurfaceView在相机预览中的应用及其工作原理。
摘要由CSDN通过智能技术生成

人脸识别过程:人脸拍照,照片传给平台,平台进行人脸比对,返回比对结果。下面将介绍人脸识别的每个过程

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 的比例。由于不同厂商对相机的实现都会有差异,所以很多参数在不同的手机上支持的情况也不一样,相机的预览尺寸也是。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值