人脸组件
人脸组件整体介绍
SDK支持通过机器人设备中摄像头采集到的图像信息,进行人脸检测,在线/离线人脸识别。
组件配置
使用SDK的人脸组件功能前,需要人脸组件功能进行配置。
获取配置对象
1FaceModuleConfig faceModuleConfig = new FaceModuleConfig()
配置组件
1// 相机类型
2faceModuleConfig.cameraType = FaceModuleConfig.TYPE_INTERNAL_FRONT;
3// 相机图像帧,人脸检测前旋转角度
4// 正常完成人脸检测识别,需要图像帧内的人脸方向为正向
5faceModuleConfig.faceAngle = FaceModuleConfig.ANGLE_90;
6// 预览图片方向
7faceModuleConfig.videoDirection = FaceModuleConfig.ANGLE_270;
8// 人脸识别方式为在线
9faceModuleConfig.recType = FaceModuleConfig.REC_TYPE_ONLINE;
10// 人脸识别方式为离线
11// faceModuleConfig.recType = FaceModuleConfig.REC_TYPE_OFFLINE;
12// 离线人脸图片目录路径(属性默认路径为/storage/emulated/0/baidu_robot/UserPicture)
13// faceModuleConfig.offlineFaceRecognizeImageDir = "/sdcard/faceImage"
14// 在线1:N人脸识别,设置使用人脸库ID
15// 如果不设置,会默认使用开放平台配置的默认人脸库,设置人脸库属性要确保开放平台已配置对应的库信息
16faceModuleConfig.faceGroup = "VIPFace";
组件使用流程
启动/停止人脸识别功能
通过调用RobotSDKManager.getInstance().startFaceRecognize()接口来启动人脸识别功能。
1/**
2 * 启动人脸识别功能
3 * @param textureView UI预览用TextureView,需要设置为可见,View宽高最小为1dp*1dp
4 * @param faceTaskType 人脸功能任务类型(人脸识别使用FaceModuleConfig.TASK_FACE_RECOGNIZE)
5 * @param faceDetectCallBack 人脸检测回调接口
6 * @return 是否启动成功
7 */
8boolean startFaceRecognize(TextureView textureView,
9 int faceTaskType,
10 IFaceDetectCallBack faceDetectCallBack);
通过RobotSDKManager.getInstance().stopFaceRecognize()接口来停止人脸识别功能。
1/**
2 * 停止人脸识别
3 */
4void stopFaceRecognize();
获取人脸检测回调信息
开启人脸识别功能后,可以通过实现IFaceDetectCallBack接口来获取启动人脸识别功能后,人脸检测的回调信息。
1/**
2 * 人脸检测回调接口
3 */
4public interface IFaceDetectCallBack {
5
6 /**
7 * 人脸检测回调方法
8 *
9 * @param livenessModel 检测到人脸数据对象
10 */
11 void onFaceDetectCallback(FaceModel livenessModel);
12
13 /**
14 * 人脸检测状态回调方法
15 *
16 * @param code 人脸检测状态码
17 * @param msg 人脸检测状态信息
18 */
19 void onFaceDetectStatus(int code, String msg);
20
21 /**
22 * 人脸检测UI渲染接口(预留功能接口,暂不使用)
23 *
24 * @param livenessModel 检测到人脸数据对象
25 */
26 void onFaceDetectDrawCallback(FaceModel livenessModel);
27
28 /**
29 * 离线人脸识别回调接口
30 * 人脸组件配置为离线识别时使用faceModuleConfig.recType = REC_TYPE_OFFLINE;
31 *
32 * @param faceModel 检测到人脸数据对象
33 */
34 void onOfflineFaceRecognize(FaceModel faceModel);
35
36 /**
37 * 发现有人脸(没有人脸质量检测)
38 * @param livenessModel
39 */
40 void onNoQualityDetectCallback(FaceModel livenessModel);
41}
人脸检测回调接口实现样例:
1private IFaceDetectCallBack mFaceDetectCallback = new IFaceDetectCallBack() {
2 @Override
3 public void onFaceDetectCallback(FaceModel livenessModel) {
4 if (livenessModel == null || livenessModel.getFaceInfo() == null) {
5 // 没有检测到人脸
6 } else {
7 // 检测到人脸
8 FaceInfo faceInfo = livenessModel.getFaceInfo();
9 // 人脸宽度
10 float faceWidth = faceInfo.width;
11 // 人脸高度
12 float faceHeight = faceInfo.height;
13 // 人脸分数
14 float faceScore = faceInfo.score;
15 // 性别
16 BDFaceSDKCommon.BDFaceGender bdFaceGender = faceInfo.gender;
17 // 年龄
18 int age = faceInfo.age;
19 // 是否带眼镜
20 BDFaceSDKCommon.BDFaceGlasses bdFaceGlasses = faceInfo.glasses;
21 }
22 }
23
24 @Override
25 public void onFaceDetectStatus(int statusCode, final String statusMsg) {
26 // 人脸检测时的状态码和状态信息,例如:statusCode = -20104,statusMsg = 图片比较模糊
27 int code = statusCode;
28 String msg = statusMsg;
29 }
30
31 @Override
32 public void onOfflineFaceRecognize(final FaceModel faceModel) {
33 if (faceModel != null) {
34 // 获取离线识别人脸的用户名称
35 String offlineUserName = faceModel.getOfflineRecognizeResult().mName;
36 }
37 }
38
39 @Override
40 public void onFaceDetectDrawCallback(FaceModel livenessModel) {
41 // 预留接口,暂不使用
42 }
43 /**
44 * 发现有人脸(没有人脸质量检测)
45 * @param livenessModel
46 */
47 public void onNoQualityDetectCallback(FaceModel livenessModel) {
48 // 做人脸质量检测前的人脸数据对象
49 }
50};
获取人脸识别结果
开启人脸识别功能后,想获取在线人脸识别结果,需要实现服务端指令回调接口IDirectiveCallback,实现的接口添加到SDK指令回调接口列表内:
1IDirectiveCallback directiveCallback = new IDirectiveCallback() {
2...
3}
4// 添加到SDK指令回调接口列表
5RobotSDKManager.getInstance().addDirectiveListener(directiveCallback)
关于指令回调接口的具体介绍,可以参考 服务端和客户端交互指令说明 。
获取离线人脸识别结果
通过实现IFaceDetectCallBack接口onOfflineFaceRecognize方法获取离线人脸识别结果数据。
1private IFaceDetectCallBack mFaceDetectCallback = new IFaceDetectCallBack() {
2 @Override
3 public void onFaceDetectCallback(FaceModel livenessModel) {
4 if (livenessModel == null || livenessModel.getFaceInfo() == null) {
5 // 没有检测到人脸
6 } else {
7 // 检测到人脸
8 FaceInfo faceInfo = livenessModel.getFaceInfo();
9 }
10 }
11 ...
12 ...
13 @Override
14 public void onOfflineFaceRecognize(final FaceModel faceModel) {
15 if (faceModel != null) {
16 // 获取离线识别人脸的用户数据对象faceModel
17 // 获取离线用户对象的用户名
18 String offlineUserName = faceModel.getOfflineRecognizeResult().mName;
19 }
20 }
21};
加载离线人脸库数据
1.加载离线人脸库
使用离线人脸识别功能,需要先录入离线人脸库数据,人脸图片路径通过faceModuleConfig.offlineFaceRecognizeImageDir属性配置。
- 属性默认路径为/storage/emulated/0/baidu_robot/UserPicture。
通过RobotSDKManager.getInstance().recordAllFaceFeature()方法完成离线人脸数据的录入,数据录入后会作为离线人脸识别时的离线人脸库使用。
1/**
2 * 加载离线人脸识别照片信息
3 * @param featureType 照片类型,普通照片使用BDFACE_FEATURE_TYPE_LIVE_PHOTO属性
4 * BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO(生活照)
5 * BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_ID_PHOTO(证件照)
6 * @return
7 */
8int recordAllFaceFeature(BDFaceSDKCommon.FeatureType featureType);
2.离线人脸库图片要求
- 支持jpg和png图片格式
- 图片尺寸 > 640 * 480, 作为离线人脸库底图尽量采用清晰人脸图片
增量更新离线人脸库数据
通过recordDeltaFaceFeature()方法增量更新本地存储离线人脸的数据库。
1RobotSDKManager.getInstance().recordDeltaFaceFeature()
清空离线人脸数据库
通过clearLocalFaceDatabase()清空离线人脸特征的数据库。
1RobotSDKManager.getInstance().clearLocalFaceDatabase()
其他API功能
离线人脸1:1验证
1RobotSDKManager.getInstance().offlineCompareFace(@NonNull Bitmap src, @NonNull Bitmap dest,@NonNull IFaceCompareCallback callback)
IFaceCompareCallback的定义
1/**
2 * 人脸比对回调接口
3 */
4public interface IFaceCompareCallback {
5 /**
6 * 人脸1:1识别结果回调
7 *
8 * @param score 对比相似度值(0-100)
9 */
10 void onCompareSuccess(float score);
11
12 /**
13 * 错误事件回调
14 *
15 * @param errorCode 错误码
16 */
17 void onCompareError(int errorCode);
18}
在线人脸比对(1:1)相关接口
1/**
2 * 1:1 图片比对 (生活照)
3 * 单次请求,两张图片的大小之和需要小于12M
4 *
5 * @param faceImg 待比对人脸照片
6 * @param dailyPhotoImg 生活照,通常为手机、相机拍摄的人像图片、或从网络获取的人像图片等
7 */
8 public void compareFaceWithDailyPhoto(Bitmap faceImg, Bitmap dailyPhotoImg)
9
10 /**
11 * 1:1 图片比对 (身份证芯片照)
12 * 单次请求,两张图片的大小之和需要小于12M
13 *
14 * @param faceImg 待比对人脸照片
15 * @param idCardPhotoInChip 身份证芯片照,即二代身份证芯片中内置的人像照片
16 */
17 public void compareFaceWithChipIDCard(Bitmap faceImg, Bitmap idCardPhotoInChip)
18
19 /**
20 * 1:1 图片比对 (带水印证件照)
21 * 单次请求,两张图片的大小之和需要小于12M
22 *
23 * @param faceImg 待比对人脸照片
24 * @param docPhotoWithWatermark 带水印证件照,一般为带水印的小图,如公安网小图
25 */
26 public void compareFaceWithWatermarkIDCard(Bitmap faceImg, Bitmap docPhotoWithWatermark)
27
28 /**
29 * 1:1 图片比对 (普通证件照)
30 * 单次请求,两张图片的大小之和需要小于12M
31 *
32 * @param faceImg 待比对人脸照片
33 * @param docPhotoImg 证件照片,如拍摄的身份证、工卡、护照、学生证等证件图片,注:需要确保人脸部分不可太小,通常为100px*100px
34 */
35 public void compareFaceWithDocPhoto(Bitmap faceImg, Bitmap docPhotoImg)
状态码以及错误码
错误码/状态码 | 描述 |
---|---|
-20100 | 未检测到人脸 |
-20101 | 人脸左右偏转角度超出限制 |
-20102 | 人脸平行平面内的头部旋转角超出限制 |
-20103 | 人脸上下偏转角超出限制 |
-20104 | 人脸模糊值超出限制 |
-20105 | 人脸光照值低于阈值 |
-20106 | 人脸左眼遮挡 |
-20107 | 人脸右眼遮挡 |
-20108 | 人脸鼻子遮挡 |
-20109 | 人脸嘴遮挡 |
-20110 | 人脸左脸颊遮挡 |
-20111 | 人脸右脸颊遮挡 |
-20112 | 人脸下巴遮挡 |