android camera2人脸识别流程分析

本文通过分析原生Android Camera2 API源码,探讨了在开启相机后如何进行人脸识别。由于系统人脸识别接口在某些平台上缺乏回调,使得在高通和MTK平台上无法直接显示人脸框,但展讯平台提供了支持。人脸识别的启动位于onCameraAvailable()中的startPreview()函数。在UI层面上,FaceView用于显示人脸,并在接收到MSG_SWITCH_FACES消息时刷新。在framework层,从CameraDevice的setFaceDetectionCallback和startFaceDetection开始,经过一系列回调,完成人脸识别的流程。
摘要由CSDN通过智能技术生成

节后回来刚好比较空,今天总结一下camera的人脸识别流程,老样子拿原生camera2源码来分析,但是这里有一个非常严峻的问题是系统人脸识别依赖的framework接口,在Camera_api2中原生接口是没有回调函数的,APK的流程在高通和MTK平台是显示不出人脸框的,只有展讯平台对此做了支持,所以要使用此功能需要用API1。这里说明下我所说的google原生API接口可以在http://androidxref.com中查询的。
人脸识别是camera的功能所以只有在打开camera之后才能开启人脸识别,所以源码是在onCameraAvailable中的startPreview()函数开启人脸识别。onCameraAvailable我们前面讲到过是camera open之后的回调函数,下面直接上源码

PhotoModule.java

private CameraProxy mCameraDevice;

@Override
public void onCameraAvailable(CameraProxy cameraProxy) {

    mCameraDevice = cameraProxy;

    .........

    startPreview();

    onCameraOpened();
}


private void startPreview() {

    .........

    CameraAgent.CameraStartPreviewCallback startPreviewCallback =
        new CameraAgent.CameraStartPreviewCallback() {
            @Override
            public void onPreviewStarted() {
                mFocusManager.onPreviewStarted();
                PhotoModule.this.onPreviewStarted();
                SessionStatsCollector.instance().previewActive(true);
                if (mSnapshotOnIdle) {
                    mHandler.post(mDoSnapRunnable);
                }
            }
        };
    if (GservicesHelper.useCamera2ApiThroughPortabilityLayer(mActivity)) {
        mCameraDevice.startPreview();
    //这里调用onPreviewStarted
        startPreviewCallback.onPreviewStarted();
    } else {
        mCameraDevice.startPreviewWithCallback(new Handler(Looper.getMainLooper()),
                startPreviewCallback);
    }
}

private void onPreviewStarted() {
    mAppController.onPreviewStarted();
    mAppController.setShutterEnabled(true);
    setCameraState(IDLE);
    //这里startFaceDetection
    startFaceDetection();
    settingsFirstRun();
}

//这里startFaceDetection()继承自FocusOverlayManager.Listener
@Override
public void startFaceDetection() {
    if (mFaceDetectionStarted || mCameraDevice == null) {
        return;
    }
    if (mCameraCapabilities.getMaxNumOfFacesSupported() > 0) {
        mFaceDetectionStarted = true;
    //这里mUI是PhotoUI.java
        mUI.onStartFaceDetection(mDisplayOrientation, isCameraFrontFacing());

    /*这里2个参数分别是Handler和CameraFaceDetectionCallback,这里我们着重讲解camera_api2,而在API2中setFaceDetectionCallback啥事都不干。
    所以你将得不到回调,在UI中也无法显示人脸框,所以这里我们用的API1也就是AndroidCameraAgentImpl.java。*/
        mCameraDevice.setFaceDetectionCallback(mHandler, mUI);
    //这里调用的是CameraAgent.java的startFaceDetection,上一句设置人脸识别的callback函数这句启动人脸识别,这两句的framework流程后面再分析。
        mCameraDevice.startFaceDetection();
        SessionStatsCollector.instance().faceScanActive(true);
    }
}

上面讲到mUI是PhotoUI,下面来看下PhotoUI.java

public class PhotoUI implements PreviewStatusListener,
    CameraAgent.CameraFaceDetectionCallback, PreviewStatusListener.PreviewAreaChangedListener {
   

    //这里FaceView就是显示人脸识别的那个框
    private final FaceView mFaceView;

    public void onStartFaceDetection(int orientation, boolean mirror) {
        if (mFaceView != null) {
            mFaceView.clear();
            mFaceView.setVisibility(View.VISIBLE);
            mFaceView.setDisplayOrientation(orientation);
            mFaceView.setMirror(mirror);
            mFaceView.resume();
        }
    }

    /
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值