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文件夹下,用于人脸库的图片显示。