百度人脸识别算法SDK3+注册流程

2019-09-26  本文已影响0人  dongbingliu

2.3.2 人脸注册
进入该功能之后首先需要录入输入用户名+组名,用户名要求不能含有特殊符号,要求不能超过30个字符,填入成功之后才可进入视频流实时采集页面。FaceRegisterActivity是注册页面。采集页面将会执行人脸检测、人脸活体检测、特征值提取功能。前面都通过即执行注册,注册成功后并将注册成功的图片保存到本地。您可以根据实际使用的硬件进行选择。

注一:为了使注册的图片达到较高的质量,注册默认开启质量检测与远近距离校验。设置里的质量检测开关对注册页面不起作用。

注二:为了使注册效果更好。所有活体状态下注册默认开启固定区域检测,设置里的检测跟踪策略对注册页面不起作用。

1)注册采集,可选择一下3种方式返回人脸

FaceRGBRegisterActivity:无活体或RGB活体(活体检测成功后,注册人脸)
FaceIRRegisterActivity:进行RGB+NIR活体成功后注册人脸
FaceDepthRegisterActivity:进行RGB+Depth活体成功后注册人脸(目前仅支持奥比中光Atlas镜头)
下面是检测相关代码:

private void faceDetect(byte[] data, final int width, final int height) {
    // 摄像头预览数据进行人脸检测
    int liveType = SingleBaseConfig.getBaseConfig().getType();
    if (liveType == 1) { // 无活体检测
        FaceTrackManager.getInstance().setAliving(false);
    } else if (Integer.valueOf(liveType) == 2) { // 活体检测
        FaceTrackManager.getInstance().setAliving(true);
    }
    FaceTrackManager.getInstance().faceTrack(data, width, height, new FaceDetectCallBack() {
        @Override
        public void onFaceDetectCallback(LivenessModel livenessModel) {
            checkResult(livenessModel);
        }
    });
}

下面是活体判断相关代码:

    int liveType = SingleBaseConfig.getBaseConfig().getType();
        // 无活体
        if (Integer.valueOf(liveType) == 1) {
            displayResult(model, null);
            // 注册
            register(model);
        } else if (Integer.valueOf(liveType) == 2) { // RGB活体检测
            displayResult(model, "livess");
            boolean livenessSuccess = false;
            float rgbLiveThreshold = SingleBaseConfig.getBaseConfig().getRgbLiveScore();
            livenessSuccess = (model.getRgbLivenessScore() > rgbLiveThreshold) ? true : false;
            if (livenessSuccess) {
                // 注册
                register(model);
            }
        }

下面是人脸特征提取的代码:

// 获取选择的特征抽取模型
    int modelType = SingleBaseConfig.getBaseConfig().getActiveModel();
    if (modelType == 1) {
        // 生活照
        FaceSDKManager.getInstance().onFeatureCheck(model.getBdFaceImageInstance(), model.getLandmarks(),
                BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO, new FaceFeatureCallBack() {
                    @Override
                    public void onFaceFeatureCallBack(float featureSize, byte[] feature) {
                        displayCompareResult(featureSize, feature);
                        Log.e("qing", String.valueOf(feature.length));
                    }

                });

    } else if (Integer.valueOf(modelType) == 2) {
        // 证件照
        FaceSDKManager.getInstance().onFeatureCheck(model.getBdFaceImageInstance(), model.getLandmarks(),
                BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_ID_PHOTO, new FaceFeatureCallBack() {
                    @Override
                    public void onFaceFeatureCallBack(float featureSize, byte[] feature) {
                        displayCompareResult(featureSize, feature);
                    }
                });
    }

下面是将特征值及用户信息注册到人脸库的代码:

 // 根据特征抽取的结果 注册人脸
 private void displayCompareResult(float ret, byte[] faceFeature) {
    // 特征提取成功
    if (ret == 128) {
        String imageName = groupId + "-" + username + ".jpg";
        // 注册到人脸库
        boolean isSuccess = FaceApi.getInstance().registerUserIntoDBmanager(groupId, username, imageName,
                userInfo, faceFeature);
        if (isSuccess) {
            // 关闭摄像头
            CameraPreviewManager.getInstance().stopPreview();
            Log.e("qing", "注册成功");
            // 数据变化,更新内存
            FaceApi.getInstance().initDatabases(true);
            // 防止重复注册
            username = null;
            groupId = null;
        }else {
            // 注册失败
        }
    } else if (ret == -1) {
        displayTip("特征提取失败");
    } else {
      // 特征提取失败
    }
}

参数填写时请注意:

用户名为必填项,支持英文与数字。
用户组为可选项,不填默认生成名为default 的用户组;
用户信息可不填,用于其他需求;
注册成功后生成的图片命名格式为group-username.jpg,保存在sdcard下的Success-Import文件夹下,用于人脸库的图片显示。

上一篇下一篇

猜你喜欢

热点阅读