本文介绍离线人脸识别SDK接入方式。
授权方式说明
离线人脸识别SDK目前支持在线联网激活,以获得SDK使用授权,被授权的设备和App,在有效期内可以运行SDK,离线完成包括人脸库管理、人脸检测、人脸比对、人脸检索、活体判断等功能。授权结束之后,将无法使用任何功能,需要重新激活获得授权。
- 删除SDK
- 设备刷机
- 清除数据
- 恢复出厂设置
- 授权有效期到期
- 新设备首次使用
免费测试:我们为每个接入方提供2个免费测试授权,用于SDK接入试用,测试授权在激活后的1个月内有效。
正式购买:客户根据业务需要购买相应时长的SDK使用授权,具体定价可联系阿里云客户经理咨询。
步骤一:SDK下载
离线人脸识别SDK可通过服务端接口进行下载。关于服务端接口的具体内容,请参见CreateVerifySDK和DescribeVerifySDK。
步骤二:在工程中导入SDK
- lib-verify-xxx-release.aar
- SecurityBodySDK-external-release.aar
- SecurityGuardSDK-external-release.aar
- 设定依赖包所在的路径:
apply plugin: 'com.android.application' repositories { flatDir { dirs '../libs' } }
- 设定引入的本地库所在路径,将需要引入的依赖包都放在../libs目录,包含所有需要的库。
- 在gradle文件中引入以下需要的库依赖:
implementation (name:'lib-verify-xxx-release',ext:'aar') implementation (name:'SecurityGuardSDK-external-release-5.4.121',ext:'aar') implementation (name:'SecurityBodySDK-external-release-5.4.79',ext:'aar') implementation "com.squareup.okhttp3:okhttp:3.12.0" // 版本可以和业务工程的okhttp版本保持一致。
说明 未来各依赖库的版本号会有所变化,实际版本号以下载到的SDK为准。
- 解压已下载的离线人脸识别SDK包,获得yw_1222_*.jpg签名图片文件,该文件在SDK授权时需要使用。
- 把该图片文件导入到工程中res\drawable\目录,如果没有这个文件夹,请先在工程中创建,否则将无法正常工作。
- 如果在安卓工程打包时启用了shrinkResources true,还需要在keep.xml文件中添加以下内容:
<resources xmlns:tools="http://schemas.android.com/tools" tools:keep="@drawable/yw_1222_*" />
- 离线人脸识别SDK会与App包名(package name)+签名(keystore)绑定,所以若App的package name或keystore有变化都需要重新下载SDK,若无变化,则不需要重新下载。
ABI类型
defaultConfig {
ndk {
abiFilters "armeabi-v7a", "arm64-v8a"
}
}
关于gradle(重要)
离线人脸识别SDK目前只支持gradle plugin版本在3.4.1版本及以下。
步骤三:SDK初始化及相关配置
接入方只需关注SDK提供的VerifySDKManager类,上层与SDK的交互都是通过VerifySDKManager进行调用。
- 设置是否开启设备管理功能
接口名:setNeedDeviceManage
接口描述:使用initWithToken初始化方法,需要开启设备管理功能。表 1. setNeedDeviceManage参数说明 名称 类型 描述 needDeviceManage Boolean 是否开启设备管理。 - true:表示开启设备管理。
- false:表示不开启设备管理。
VerifySDKManager.getInstance().setNeedDeviceManage(true);
- 使用授权key进行初始化
接口名:initWithToken
接口描述:使用授权key,初始化结果通过回调告知。表 2. initWithToken参数说明 名称 类型 描述 context String 当前activity的上下文。 token String 激活使用的授权key,从实人认证服务端申请获得。 initWithTokenCallback InitWithTokenCallback 回调函数,获取初始化结果。 说明 如果设备目录/sdcard/verify/verifysdk/ab.bin存在且有效,可以使用token=””
直接进行本地断网初始化。如果本地初始化失败,需要联网在线初始化,激活使用的授权key,从实人认证服务端CreateAuthKey接口获得,在线联网初始化会将最新的授权文件ab.bin下载到本地,完成SDK授权。// 初始化结果字段。 private int regCode = -1; // 回调函数。 private OnInitListener initWithTokenCallback = new OnInitListener(){ @Override public void onInitResult(int code) { regCode = code; Log.i("initData","return code: " + code); } }; // activity onCreate方法中进行SDK初始化。 VerifySDKManager.getInstance().setNeedDeviceManage(true); VerifySDKManager.getInstance().initWithToken(getApplicationContext(),"",initWithTokenCallback); if(regCode !=0){ // 调用接入方服务端,服务端通过调用实人认证服务端接口CreateAuthKey获取。 // String token = VerifySDKManager.getInstance().initWithToken(getApplicationContext(),token,initWithTokenCallback); }
SDK提供相关设置函数。例如,设置人脸检测的最小尺寸、是否开启翻拍检测、是否开启红外活体检测、翻拍检测阈值、红外活体阈值、人脸检索匹配阈值等,接入方可以按需设置。
- 设置最小检测人脸
接口名:setMinFaceDetectSize
接口描述:设置最小检测人脸,图像中的人脸大小超过该值时,才能检测到人脸,否则无法检测到人脸。表 3. setMinFaceDetectSize参数说明 名称 类型 描述 minFaceDetectSize Float 人脸检测的最小尺寸,取值范围0-1,定义为占图像min(宽,高)的比例,默认值0.1。 VerifySDKManager.getInstance().setMinFaceDetectSize(0.05f);
- 设置人脸位置有效区域边界
接口名:setBorders
接口描述:设置人脸位置有效区域边界。表 4. setBorders参数说明 名称 类型 描述 leftBorder Float 人脸位置有效区域的左边界,定义为占旋转后图像宽度的比例,默认值0.1。 rightBorder Float 人脸位置有效区域的右边界,定义为占旋转后图像宽度的比例,默认值0.9。 topBorder Float 人脸位置有效区域的上边界,定义为占旋转后图像高度的比例,默认值0.1。 bottomBorder Float 人脸位置有效区域的下边界,定义为占旋转后图像高度的比例,默认值0.9。 VerifySDKManager.getInstance().setBorders(0.1f,0.9f,0.1f,0.9f);
- 设置是否开启离线翻拍检测
接口名:setNeedRecapCheck
接口描述: 设置是否开启离线翻拍检测。表 5. setNeedRecapCheck参数说明 名称 类型 描述 needRecapCheck Boolean 是否开启离线翻拍检测。 - true:表示开启离线翻拍检测。
- false:表示不开启离线翻拍检测。
VerifySDKManager.getInstance().setNeedRecapCheck(true);
- 设置是否开启红外防彩色图片翻拍检测
接口名:setNeedNirSeniorRecapCheck
接口描述:设置是否开启红外防彩色图片翻拍检测。表 6. setNeedNirSeniorRecapCheck参数说明 名称 类型 描述 needNirSeniorRecapCheck Boolean 是否开启红外防彩色图片翻拍检测。 - true:表示开启红外防彩色图片翻拍检测。
- false:表示不开启红外防彩色图片翻拍检测。
示例代码:VerifySDKManager.getInstance().needNirSeniorRecapCheck(true);
- 设置是否需要红外活体能力
接口名:setNeedNirLiveness
接口描述:设置是否需要红外活体能力,若设置需要红外活体能力,那么setNirFrameW、setNirFrameH、setNirAngle、setRgbAngle为必要参数,最后再调用init方法进行生效。表 7. setNeedNirLiveness参数说明 名称 类型 描述 needNirLiveness Boolean 是否需要红外活体能力。 - true:表示需要红外活体能力。
- false:表示不需要红外活体能力。
示例代码:VerifySDKManager.getInstance().needNirLiveness(true).setNirAngle(0).setNirFrameH(480).setNirFrameW(640).setRgbAngle(0).init(getApplicationContext());
- 设置红外图像的帧高度
接口名:setNirFrameH
接口描述:设置红外图像的帧高度,默认值为720。表 8. setNirFrameH参数说明 名称 类型 描述 nirFrameH Integer 红外图像的帧高度,默认值为720。 - 设置红外图像的帧宽度
接口名:setNirFrameW
接口描述:设置红外图像的帧宽度,默认值为720。表 9. setNirFrameW参数说明 名称 类型 描述 nirFrameW Integer 红外图像的帧宽度,默认值为720。 - 设置红外图像的旋转角度
接口名:setNirAngle
接口描述:设置红外图像的旋转角度,默认值为0。表 10. setNirAngle参数说明 名称 类型 描述 nirAngle Integer 红外图像的旋转角度,默认值为0。 - 设置RGB图像的旋转角度
接口名:setRgbAngle
接口描述:设置RGB图像的旋转角度,默认值为0。表 11. setRgbAngle参数说明 名称 类型 描述 rgbAngle Integer RGB图像的旋转角度,默认值为0。 - 设置翻拍检测阈值
接口名:setRecapThreshold
接口描述:设置翻拍检测阈值,目前翻拍默认分值是80f,取值范围0~100,翻拍得分大于等于80f则认为是翻拍,小于80f则认为是真人。接入方可根据业务实际需要进行阈值调整。表 12. setRecapThreshold参数说明 名称 类型 描述 recapThreshold Float 设置翻拍检测阈值,默认值80f。 示例代码:VerifySDKManager.getInstance().setRecapThreshold(80f);
- 设置红外活体阈值
接口名:setNirScoreThreshold
接口描述:设置红外活体阈值,目前默认分值是0f,取值范围0~1,接入方可根据业务实际需要进行阈值调整。表 13. setNirScoreThreshold参数说明 名称 类型 描述 nirScoreThreshold Float 设置红外活体阈值,默认值0f。 示例代码:VerifySDKManager.getInstance().setNirScoreThreshold(0f);
- 设置人脸匹配阈值
接口名:setFaceMatchThreshold
接口描述:设置人脸匹配阈值,目前默认分值是0.44f,取值范围0~1,接入方可根据业务实际需要进行阈值调整。表 14. setFaceMatchThreshold参数说明 名称 类型 描述 faceMatchThreshold Float 设置人脸匹配阈值,默认值0.44f。 示例代码:VerifySDKManager.getInstance().setFaceMatchThreshold(0f);
- 设置支持口罩识别能力
接口名:setNeedSupportMaskVerify
接口描述:默认口罩识别能力是关闭的,如果需要使用,需要手动设置打开。打开后,在底照入库时,一个用户需要同时添加不带口罩照片和戴口罩照片,可以达到最好的戴口罩识别效果。
示例代码:VerifySDKManager.getInstance().setNeedSupportMaskVerify(true);
步骤四:SDK用户库操作
初始化成功后,如果要使用SDK的人脸1:N检索能力,需要进行相应用户库操作,向人脸库中添加人脸图片,否则人脸检索将无法匹配。
如果要使用SDK的人脸1:1比对能力,则可以不关注用户库操作,请参见人脸识别部分的说明。
- 加载用户库
接口名:loadUserLib
接口描述:用于初始时加载全量用户库。
表 15. loadUserLib参数说明 名称 类型 描述 listener VerifyLibEventListener 用户库操作回调。 示例代码:// 加载用户数据到内存。 VerifySDKManager.getInstance().loadUserLib(verifyLibEventListener);
- 添加本地用户照片
接口名:addUser
接口描述:添加本地用户照片到用户库,操作结果以回调方式通知,完成后不必重新loadUserLib。添加后,用户照片数据会存储在设备本地数据库,适用于人脸底库数量不大或设备存储空间相对充裕的情况。说明 使用该函数添加用户照片,优势是当人脸算法模型更新升级时,接入方不需要再重新入库一次用户照片,SDK会根据本地已有的照片数据重新提取特征值,支持在新模型下的运行;劣势是照片数据会占用一定的设备存储空间。表 16. addUser参数说明 名称 类型 描述 isSync Boolean 是否同步调用。 - true:表示建议上层调用入库自己管理线程。
- false:表示不需要上层调用入库自己管理线程。
id String 用户ID,需要保证唯一性。 type Integer 生物特征类型,目前只支持BiologyType.BIOLOGY_FACE。 featureData byte[] 用户照片的byte源数据,支持JPG、PNG格式。 verifyLibEventListener VerifyLibEventListener 用户库操作回调。 VerifySDKManager.getInstance().addUser(true, String.valueOf(i), BiologyType.BIOLOGY_FACE,FileUtil.getFileBuffer(path),verifyLibEventListener);
接口名:addUserWithoutFeatureData
接口描述:添加本地用户照片,操作结果以回调方式通知。添加后,用户照片数据不会存储在设备本地数据库,适用于人脸底库数量大或设备存储空间有限的情况。说明- 使用该函数添加用户照片,优势是不占用设备存储空间;劣势是当人脸算法模型更新升级时,本地已有的特征库无法适配新模型,SDK会运行失败,需要接入方再重新入库一次用户照片,以便新模型重新提取特征值,确保SDK正常运行。
- 使用该函数的接入方,需要在onUserLibLoaded回调函数中处理errorCode=104的错误码,详见onUserLibLoaded调用示例代码。
表 17. addUserWithoutFeatureData参数说明 名称 类型 描述 isSync Boolean 是否同步调用。 - true:表示建议上层调用入库自己管理线程。
- false:表示不建议上层调用入库自己管理线程。
id String 用户ID,需要保证唯一性。 type Integer 生物特征类型,目前只支持BiologyType.BIOLOGY_FACE。 featureData byte[] 用户照片的byte源数据,支持JPG、PNG格式。 verifyLibEventListener VerifyLibEventListener 用户库操作回调。 VerifySDKManager.getInstance().addUserWithoutFeatureData(true, String.valueOf(i), BiologyType.BIOLOGY_FACE,FileUtil.getFileBuffer(path),verifyLibEventListener);
- 删除指定用户生物数据
接口名:removeUser
接口描述:删除指定用户生物数据,操作结果以回调方式通知,无需重新loadUserLib。表 18. removeUser参数说明 名称 类型 描述 isSync Boolean 是否同步调用。 - true:表示建议上层调用入库自己管理线程。
- false:表示不需要上层调用入库自己管理线程。
id String 用户ID。 verifyLibEventListener VerifyLibEventListener 用户库操作回调。 VerifySDKManager.getInstance().removeUser(false,id,verifyLibEventListener);
- 清空所有用户数据
接口名:clearUserLib
接口描述:清除本地用户库。表 19. clearUserLib参数说明 名称 类型 描述 isSync Boolean 是否同步调用。 - true:表示建议上层调用入库自己管理线程。
- false:表示不建议上层调用入库自己管理线程。
verifyLibEventListener VerifyLibEventListener 用户库操作回调。 VerifySDKManager.getInstance().clearUserLib(false,verifyLibEventListener);
- 单用户数据更新回调
接口名:onSingleUserLibUpdate
接口描述:用户库操作回调,单用户数据更新。表 20. onSingleUserLibUpdate参数说明 名称 类型 描述 id String 用户ID。 errorCode Integer 错误码,0为正确。 - 用户库加载完成回调
接口名:onUserLibLoaded
接口描述:loadUserLib操作回调,用户库加载完成。表 21. onUserLibLoaded参数说明 名称 类型 描述 errorCode Integer 错误码,0为正确。 说明 使用addUserWithoutFeatureData函数添加用户的接入方,需要特殊处理该回调函数errorCode=104的错误码,详见下方示例代码中说明。 - 用户库清除回调
接口名:onUserLibEmpty
接口描述:clearUserLib操作回调,用户库清除完成。表 22. onUserLibEmpty参数说明 名称 类型 描述 errorCode Integer 错误码,0为正确。 // 用户库操作回调。 final OnVerifyLibEventListener verifyLibEventListener = new OnVerifyLibEventListener() { @Override public void onSingleUserLibUpdate(String id, final int errorCode) { // 单用户更新操作完成后处理。 } @Override public void onBatchUserLibUpdate(int errorCode) { // 批量用户更新,暂时不支持。 } @Override public void onUserLibLoaded(int errorCode) { // loadUserLib操作完成后处理。 //特殊说明:使用addUserWithoutFeatureData函数添加用户的接入方,需要在该回调中特殊处理errorCode=104的错误码,操作步骤如下: //第一步:调用clearUserLib清除本地数据。 //第二步:接入方重新入库用户数据。 } @Override public void onUserLibEmpty(int errorCode) { // clearUserLib操作完成后处理。 } };
步骤五:SDK人脸识别
人脸1:1比对说明
SDK支持实时视频流和人脸图片进行比对,这是最为常见的1:1对比类型。针对一张事先获取的图片(通常为身份证芯片照、证件照片等),与摄像头实时采集的符合条件的人脸图片进行比对。通常适用于有人值守的场景。
人脸1:N检索
将需要识别的人脸图片注册到本地人脸库中,当有用户需要识别身份时,从视频流中实时采集符合条件的人脸图片,与人脸库中的人脸集合比对,得到检索结果。如果是无人值守的情况,建议可以开启翻拍检测或红外活体保障安全性。
如果在初始化时设置开启了翻拍检测或红外活体检测,则摄像头采集的人脸图片必须同时通过活体检测,才能进入人脸检索环节,任一活体检测未通过,都不会进行人脸检索。
- 人脸1:1比对调用
- 接口名:doFaceMatchWithImage接口描述:RGB摄像头帧数据与人脸图片进行1:1比对,结果以回调方式通知。适用于设备上只有RGB单目摄像头,或者有双目摄像头但未开启红外活体检测的情况,可以使用该接口进行1:1比对。
表 23. doFaceMatchWithImage参数说明 名称 类型 描述 data byte[] 检测到合格人脸时的RGB帧数据。 width Integer 帧数据宽度。 height Integer 帧数据高度。 imageFormat Integer 帧数据格式,Android默认选择ImageFormat.NV21。 imageAngle Integer 读取到合格人脸时的图片旋转角度,取值0/90/180/270,从摄像头的回调接口中获取。 cameraRotation Integer 读取到合格人脸时的相机旋转角度,取值0/90/180/270,从摄像头的回调接口中获取。 targetBitmap Bitmap 待比对人脸图片。 listener FaceMatchWithImageListener 1:1比对回调。 // 当未开启红外活体功能时,使用OnFaceMatchWithImageListener类型做回调。 // 1:1比对的回调 OnFaceMatchWithImageListener faceMatchWithImageListener = new OnFaceMatchWithImageListener() { @Override @param faceMatchResult可以通过faceMatchResult.getMatchItems().get(0).getScore()获取对比分数。 public void onMatchResult(FaceMatchResult faceMatchResult) { // 与目标图片匹配后的处理。 } @Override public void onRecapDetected(byte[] data, int width, int height, int imageAngle, int cameraRotation, float recapScore){ // 检测到人脸翻拍。 } }; // 1:1比对调用。 VerifySDKManager.getInstance().doFaceMatchWithImage(data,width,height, ImageFormat.NV21, degree, cameraRotation, targetBitmap, faceMatchWithImageListener)
- 接口名:doFaceMatchWithImageWithNir接口描述:RGB和红外摄像头帧数据与人脸图片进行1:1比对,结果以回调方式通知。适用于设备上有双目红外的摄像头,在开启红外活体检测的情况下,可以使用该接口进行1:1比对。
表 24. doFaceMatchWithImageWithNir参数说明 名称 类型 描述 nirData byte[] 检测到合格人脸时的红外帧数据。 rgbData byte[] 检测到合格人脸时的RGB帧数据。 width Integer RGB帧数据宽度。 height Integer RGB帧数据高度。 imageFormat Integer 帧数据格式,Android默认选择ImageFormat.NV21。 imageAngle Integer 读取到合格人脸时的图片旋转角度,取值0/90/180/270,从摄像头的回调接口中获取。 cameraRotation Integer 读取到合格人脸时的相机旋转角度,取值0/90/180/270,从摄像头的回调接口中获取。 targetBitmap Bitmap 待比对人脸图片。 nirFaceDetectListener FaceMatchWithImageListener 人脸检测、检索比对、翻拍检测回调。 // 当开启红外检测时,使用OnFaceMatchWithImageNirListener类型做回调。 final OnFaceMatchWithImageNirListener faceMatchWithImageNirListener = new OnFaceMatchWithImageNirListener() { @Override @param faceMatchResult可以通过faceMatchResult.getMatchItems().get(0).getScore()获取对比分数。 public void onMatchResult(FaceMatchResult faceMatchResult) { // 与目标图片匹配后的处理。 } @Override public void onRecapDetected(byte[] data, int width, int height, int imageAngle, int cameraRotation, float recapScore) { // 检查到人脸翻拍。 } @Override public void onFaceDetectedInNIR(byte[] nirData, int width, int height, int nirAngle, NirFaceInfo nirFaceInfo){ // 红外摄像头检查到人脸。 } @Override public void onNofaceDetectedInNIR(byte[] nirData, int width, int height, int nirAngle){ // 红外摄像头没有检查到人脸。 } }; // 1:1比对接口调用,带红外活体。 VerifySDKManager.getInstance().doFaceMatchWithImageWithNir(nirData,data,width, height,ImageFormat.NV21,degree,cameraRotation, faceMatchWithImageNirListener);
- 接口名:doFaceMatchWithImage
- 人脸1:1比对结果回调
- 接口名:onMatchResult接口描述: 人脸1:1比对结果回调,可获得相应比对分。
表 25. onMatchResult参数说明 名称 类型 描述 result FaceMatchResult 人脸1:1比对结果。 - 接口名:onRecapDetected
接口描述:检测到翻拍,且初始化时开启了翻拍检测时,会执行这个回调。
接口的参数说明可以参考1:N检索中的该回调函数。
- 接口名:onFaceDetectedInNIR
接口描述:红外帧数据中检测到人脸时,会回调该函数,调用方可根据此回调做相应处理。
接口的参数说明可以参考1:N检索中的该回调函数。
- 接口名:onNofaceDetectedInNIR
接口描述:红外帧数据中未检测到人脸。
接口的参数说明可以参考1:N检索中的该回调函数。
- 接口名:onMatchResult
- 人脸1:N检索调用
-
接口名:feedPreviewFrame
接口描述:RGB摄像头帧数据与人脸库进行1:N检索,结果以回调方式通知。适用于设备上只有RGB单目摄像头,或者有双目摄像头但未开启红外活体检测的情况,可以使用该接口进行检索比对。表 26. feedPreviewFrame参数说明 名称 类型 描述 data byte[] 检测到合格人脸时的RGB帧数据。 width Integer 帧数据宽度。 height Integer 帧数据高度。 imageFormat Integer 帧数据格式,Android默认选择ImageFormat.NV21。 imageAngle Integer 读取到合格人脸时的图片旋转角度,取值0/90/180/270,从摄像头的回调接口中获取。 cameraRotation Integer 读取到合格人脸时的相机旋转角度,取值0/90/180/270,从摄像头的回调接口中获取。 faceDetectWithMatchListener FaceDetectWithMatchListener 人脸检测、检索比对、翻拍检测回调。 // 当未开启红外活体功能时,使用OnFaceDetectWithMatchListener类型做回调。 final OnFaceDetectWithMatchListener faceDetectListener = new OnFaceDetectWithMatchListener() { @Override public void onFaceDetected(byte[] data, final int width, final int height, int imageFormat, int imageAngle, int cameraRotation, final FaceInfo faceInfo) { // 识别到人脸时。 } @Override public void onNofaceDetected(byte[] data, int width, int height, int imageFormat, int imageAngle, int cameraRotation) { // 没有识别到人脸时。 } @Override public void onFaceMatched(byte[] data, int width, int height, int imageAngle, int cameraRotation, final FaceMatchResult matchResult, final long costTime) { // 识别到人脸并在用户库中匹配用户。 } @Override public void onRecapDetected(byte[] data, int width, int height, int imageAngle, int cameraRotation, float recapScore) { // 检查到人脸翻拍。 } @Override public void onFaceMoving(boolean isMoving) { // 检查到人脸移动。 } // 1:N检索接口调用,不带红外活体。 VerifySDKManager.getInstance().feedPreviewFrame(data,width, height,ImageFormat.NV21,degree,cameraRotation, faceDetectWithMatchListener);
-
接口名:feedPreviewFrameWithNir
接口描述:RGB和红外摄像头帧数据与人脸库进行1:N检索,结果以回调方式通知。适用于设备上有双目红外的摄像头,在开启红外活体检测的情况下,可以使用该接口进行检索比对。表 27. feedPreviewFrameWithNir参数说明 名称 类型 描述 nirData byte[] 检测到合格人脸时的红外帧数据。 rgbData byte[] 检测到合格人脸时的RGB帧数据。 width Integer RGB帧数据宽度。 height Integer RGB帧数据高度。 imageFormat Integer 帧数据格式,Android默认选择ImageFormat.NV21。 imageAngle Integer 读取到合格人脸时的图片旋转角度,取值0/90/180/270,从摄像头的回调接口中获取。 cameraRotation Integer 读取到合格人脸时的相机旋转角度,取值0/90/180/270,从摄像头的回调接口中获取。 nirFaceDetectListener FaceMatchWithImageListener 人脸检测、检索比对、翻拍检测回调。 // 当开启红外检测时,使用OnNirFaceDetectListener类型做回调。 final OnNirFaceDetectListener nirFaceDetectListener = new OnNirFaceDetectListener() { @Override public void onFaceDetected(byte[] data, final int width, final int height, int imageFormat, int imageAngle, int cameraRotation, final FaceInfo faceInfo) { // 识别到人脸时。 } @Override public void onNofaceDetected(byte[] data, int width, int height, int imageFormat, int imageAngle, int cameraRotation) { // 没有识别到人脸时。 } @Override public void onFaceMatched(byte[] data, int width, int height, int imageAngle, int cameraRotation, final FaceMatchResult matchResult, final long costTime) { // 识别到人脸并在用户库中匹配用户。 } @Override public void onRecapDetected(byte[] data, int width, int height, int imageAngle, int cameraRotation, float recapScore) { // 检查到人脸翻拍。 } @Override public void onFaceMoving(boolean isMoving) { // 检查到人脸移动。 } @Override public void onFaceDetectedInNIR(byte[] nirData, int width, int height, int nirAngle, NirFaceInfo nirFaceInfo){ // 红外摄像头检查到人脸。 } @Override public void onNofaceDetectedInNIR(byte[] nirData, int width, int height, int nirAngle){ // 红外摄像头没有检查到人脸。 } }; // 1:N检索接口调用,带红外活体。 VerifySDKManager.getInstance().feedPreviewFrameWithNir(nirData,data,width, height,ImageFormat.NV21,degree,cameraRotation,nirFaceDetectListener);
-
- 人脸1:N检测到人脸回调
-
接口名:onFaceDetected
接口描述:RGB帧数据中检测到人脸时,会回调该函数,调用方可根据此回调绘制人脸框。表 28. onFaceDetected参数说明 名称 类型 描述 data byte[] RGB帧数据。 width Integer RGB帧数据宽度。 height Integer RGB帧数据高度。 imageFormat Integer 帧数据格式,Android默认选择ImageFormat.NV21。 imageAngle Integer 图片旋转角度。 cameraRotation Integer 相机旋转角度。 faceInfo FaceInfo 检测到的人脸信息在帧中的坐标,宽高。 -
接口名:onFaceDetectedInNIR
接口描述:红外帧数据中检测到人脸时,会回调该函数,调用方可根据此回调做相应处理。表 29. onFaceDetectedInNIR参数说明 名称 类型 描述 nirData byte[] 红外帧数据。 width Integer 红外帧数据宽度。 height Integer 红外帧数据高度。 nirAngle Integer 图片旋转角度。 nirFaceInfo NirFaceInfo 检测到的红外人脸信息在帧中的坐标,宽高。
-
- 人脸1:N未检测到人脸回调
-
接口名:onNofaceDetected
接口描述:RGB帧数据中未检测到人脸,可以在这个回调中更新UI,移除之前绘制的人脸框。表 30. onNofaceDetected参数说明 名称 类型 描述 data byte[] RGB帧数据。 width Integer RGB帧数据宽度。 height Integer RGB帧数据高度。 imageFormat Integer 帧数据格式,Android默认选择ImageFormat.NV21。 imageAngle Integer 图片旋转角度。 cameraRotation Integer 相机旋转角度。 -
接口名:onNofaceDetectedInNIR
接口描述:红外帧数据中未检测到人脸。表 31. onNofaceDetectedInNIR参数说明 名称 类型 描述 nirData byte[] 红外帧数据。 width Integer 红外帧数据宽度。 height Integer 红外帧数据高度。 nirAngle Integer 图片旋转角度。
-
- 人脸1:N检索结果回调
接口名:onFaceMatched
接口描述:人脸检索匹配结果回调。表 32. onFaceMatched参数说明 名称 类型 描述 data byte[] RGB帧数据。 width Integer RGB帧数据宽度。 height Integer RGB帧数据高度。 imageAngle Integer 图片旋转角度。 cameraRotation Integer 相机旋转角度。 matchResult FaceMatchResult 匹配结果,极端情况下可能存在多个人的情况,比如双胞胎。 costTime Long 人脸检索比对耗时,性能分析调试用。 - 检测到翻拍回调
接口名:onRecapDetected
接口描述:检测到翻拍,且初始化时开启了翻拍检测时,会执行这个回调。表 33. onRecapDetected参数说明 名称 类型 描述 data byte[] RGB帧数据。 width Integer RGB帧数据宽度。 height Integer RGB帧数据高度。 imageAngle Integer 图片旋转角度。 cameraRotation Integer 相机旋转角度。 recapScore Float 翻拍得分。 - 人脸移动时的回调
接口名:onFaceMoving
接口描述:检测到人脸在移动时,会回调该函数。表 34. onFaceMoving参数说明 名称 类型 描述 isMoving Boolean 人脸是否移动。
SDK错误码
错误码 | 错误信息 | 错误描述 |
---|---|---|
100 | VERIFYSDK_ERR_CODE_BAD_PARAM | 参数错误。 |
101 | VERIFYSDK_ERR_CODE_ACCESS_WORK_FAILED | 访问工作路径错误。 |
104 | VERRORCODE_NEED_MANUAL_UPDATE | 人脸特征库与算法不匹配,SDK启动失败。 |
1000 | VERIFYSDK_ERR_CODE_INVALID_PARAM | 人脸引擎参数无效。 |
1001 | VERIFYSDK_ERR_CODE_SDK_NOT_INIT | 人脸引擎未初始化。 |
1002 | VERIFYSDK_ERR_CODE_INIT_MULT_TIME | 人脸引擎初始化多次。 |
1100 | VERIFYSDK_ERR_CODE_FILE_NOT_EXIST | 人脸模型文件不存在。 |
1101 | VERIFYSDK_ERR_CODE_FILE_SIZE_ERROR | 人脸模型文件大小错误。 |
1102 | VERIFYSDK_ERR_CODE_VERSION_NOT_MATCH | 人脸模型版本不匹配。 |
11020 | VERIFYSDK_ERR_CODE_VERSION_NOT_MATCH_FD | 人脸模型版本不匹配子错误。 |
11021 | VERIFYSDK_ERR_CODE_VERSION_NOT_MATCH_LDM | 人脸模型版本不匹配子错误。 |
11022 | VERIFYSDK_ERR_CODE_VERSION_NOT_MATCH_LDC | 人脸模型版本不匹配子错误。 |
11023 | VERIFYSDK_ERR_CODE_L_VERSION_NOT_MATCH_FE | 人脸模型版本不匹配子错误。 |
11024 | VERIFYSDK_ERR_CODE_VERSION_NOT_MATCH_FEENC | 人脸模型版本不匹配子错误。 |
1103 | VERIFYSDK_ERR_CODE_CANCEL | 取消。 |
1104 | VERIFYSDK_ERR_CODE_BUSY | 数据库并发操作。 |
1201 | VERIFYSDK_ERR_CODE_FEATURE_SIZE_ERROR | 人脸特征大小错误。 |
5000 | VERIFYSDK_ERR_CODE_LICENCE | 授权错误。 |
5001 | VERIFYSDK_ERR_CODE_LICENCE_INPUT | 输入参数错误。 |
5002 | VERIFYSDK_ERR_CODE_LICENCE_DATA_FORMAT | 授权文件格式错误。 |
5003 | VERIFYSDK_ERR_CODE_LICENCE_SIGN | 签名校验错误。 |
5004 | VERIFYSDK_ERR_CODE_LICENCE_APKPKG | 包名校验错误。 |
5005 | VERIFYSDK_ERR_CODE_LICENCE_PUBKEY | 公钥校验错误。 |
5006 | VERIFYSDK_ERR_CODE_LICENCE_EXPIRE | 授权过期。 |
5007 | VERIFYSDK_ERR_CODE_LICENCE_NOT_CHECK | 未进行授权检查。 |
5009 | VERIFYSDK_ERR_CODE_LICENCE_CLIENT_ID | 终端标识校验错误。 |
5010 | VERIFYSDK_ERR_CODE_LICENCE_EXPIRE_DATE_MODIFIED | 授权失效时间被修改。 |
6000 | VERIFYSDK_ERR_CODE_NOT_SUPPORT_DEVICE | 不支持的硬件型号。 |
6001 | VERIFYSDK_ERR_CODE_LOAD_LIBARY_FAILED | 加载so失败。 |
6002 | VERIFYSDK_ERR_CODE_LICENCE_NOT_EXIST | 授权文件不存在。 |
7001 | VERIFYSDK_ERR_CODE_SECURITY_TOKEN_SOCKET_TIMEOUT | 获取激活key超时,即初始化失败或未完成。 |
7003 | VERIFYSDK_ERR_CODE_GET_STATIC_DATA_STORE_COMP | SDK安全组件获取appkey失败。 |
7004 | VERIFYSDK_ERR_CODE_GET_SECURE_SIGNATURE_COMP | SDK安全组件获取加签失败。 |
7002 | VERIFYSDK_ERR_CODE_SG_SECEXCEPTION | SDK安全组件异常。 |
8001 | VERIFYSDK_ERR_CODE_GET_LICENSE_INFO_TOKEN_NULL | 带授权key激活时,key为空。 |
8002 | VERIFYSDK_ERR_CODE_GET_LICENSE_INFO_NATIVE_FAILED | 获取授权失败。 |
8003 | VERIFYSDK_ERR_CODE_GET_LICENSE_CHARSETNAME_EXCEPTION | 授权key编码转换出错。 |
9001 | VERIFYSDK_ERR_CODE_USER_LIB_NOT_LOADED | 人脸库还未初始化完成。 |
9999 | VERIFYSDK_ERR_CODE_UNKNOWN | 人脸模块未知错误。 |
10001 | VERIFYSDK_ERR_CODE_ACTIVATE_LICENSE_REQUEST_FAILED | 请求失败,激活SDK失败。 |
10002 | VERIFYSDK_ERR_CODE_ACTIVATE_LICENSE_DEVICE_NOT_AUTH | 未授权,激活SDK失败。 |
10003 | VERIFYSDK_ERR_CODE_ACTIVATE_LICENSE_DEVICE_AUTH_EXPIRED | 授权到期失效,激活SDK失败。 |
10004 | VERIFYSDK_ERR_CODE_ACTIVATE_LICENSE_DATA_NULL | 授权文件为空,激活SDK失败。 |