本文介绍离线人脸识别SDK接入方式。

授权方式说明

离线人脸识别SDK目前支持在线联网激活,以获得SDK使用授权,被授权的设备和App,在有效期内可以运行SDK,离线完成包括人脸库管理、人脸检测、人脸比对、人脸检索、活体判断等功能。授权结束之后,将无法使用任何功能,需要重新激活获得授权。

授权有效,不会消耗新的授权,仅需联网重新拉取授权:
  • 删除SDK
  • 设备刷机
  • 清除数据
  • 恢复出厂设置
授权无效,需要联网激活,且会消耗新的授权:
  • 授权有效期到期
  • 新设备首次使用

免费测试:我们为每个接入方提供2个免费测试授权,用于SDK接入试用,测试授权在激活后的1个月内有效。

正式购买:客户根据业务需要购买相应时长的SDK使用授权,具体定价可联系阿里云客户经理咨询。

步骤一:SDK下载

离线人脸识别SDK可通过服务端接口进行下载。关于服务端接口的具体内容,请参见CreateVerifySDKDescribeVerifySDK

步骤二:在工程中导入SDK

解压离线人脸识别SDK包,将以下Android依赖包引入到您的应用工程中:
  • lib-verify-xxx-release.aar
  • SecurityBodySDK-external-release.aar
  • SecurityGuardSDK-external-release.aar
  1. 设定依赖包所在的路径:
    apply plugin: 'com.android.application'
     repositories {
         flatDir {
             dirs '../libs'
         }
     }                    
  2. 设定引入的本地库所在路径,将需要引入的依赖包都放在../libs目录,包含所有需要的库。
  3. 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签名图片
  • 解压已下载的离线人脸识别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类型

离线人脸识别SDK目前支持armeabi-v7a、arm64-v8a,请接入方按需在build.gradle中增加abifilters配置。例如,接入方仅需要支持其中armeabi-v7a和arm64-v8a,则配置如下:
defaultConfig {
    ndk {
        abiFilters "armeabi-v7a", "arm64-v8a"
    }
}

关于gradle(重要)

离线人脸识别SDK目前只支持gradle plugin版本在3.4.1版本及以下。

步骤三:SDK初始化及相关配置

接入方只需关注SDK提供的VerifySDKManager类,上层与SDK的交互都是通过VerifySDKManager进行调用。

在使用SDK前必须通过setNeedDeviceManage开启设备管理功能,且通过initWithToken方法进行初始化。
  • 设置是否开启设备管理功能

    接口名: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

    接口描述:设置是否需要红外活体能力,若设置需要红外活体能力,那么setNirFrameWsetNirFrameHsetNirAnglesetRgbAngle为必要参数,最后再调用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检索

将需要识别的人脸图片注册到本地人脸库中,当有用户需要识别身份时,从视频流中实时采集符合条件的人脸图片,与人脸库中的人脸集合比对,得到检索结果。如果是无人值守的情况,建议可以开启翻拍检测或红外活体保障安全性。

如果在初始化时设置开启了翻拍检测或红外活体检测,则摄像头采集的人脸图片必须同时通过活体检测,才能进入人脸检索环节,任一活体检测未通过,都不会进行人脸检索。

视频流vs人脸库
  • 人脸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);
  • 人脸1:1比对结果回调
    • 接口名:onMatchResult
      接口描述: 人脸1:1比对结果回调,可获得相应比对分。
      表 25. onMatchResult参数说明
      名称 类型 描述
      result FaceMatchResult 人脸1:1比对结果。
      示例代码:见人脸1:1比对调用代码示例。
    • 接口名:onRecapDetected

      接口描述:检测到翻拍,且初始化时开启了翻拍检测时,会执行这个回调。

      接口的参数说明可以参考1:N检索中的该回调函数。

    • 接口名:onFaceDetectedInNIR

      接口描述:红外帧数据中检测到人脸时,会回调该函数,调用方可根据此回调做相应处理。

      接口的参数说明可以参考1:N检索中的该回调函数。

    • 接口名:onNofaceDetectedInNIR

      接口描述:红外帧数据中未检测到人脸。

      接口的参数说明可以参考1:N检索中的该回调函数。

  • 人脸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 检测到的人脸信息在帧中的坐标,宽高。
      示例代码:见1:N检索调用代码。
    • 接口名:onFaceDetectedInNIR

      接口描述:红外帧数据中检测到人脸时,会回调该函数,调用方可根据此回调做相应处理。
      表 29. onFaceDetectedInNIR参数说明
      名称 类型 描述
      nirData byte[] 红外帧数据。
      width Integer 红外帧数据宽度。
      height Integer 红外帧数据高度。
      nirAngle Integer 图片旋转角度。
      nirFaceInfo NirFaceInfo 检测到的红外人脸信息在帧中的坐标,宽高。
      示例代码:见1:N检索调用代码。
  • 人脸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 相机旋转角度。
      示例代码:见1:N检索调用代码。
    • 接口名:onNofaceDetectedInNIR

      接口描述:红外帧数据中未检测到人脸。
      表 31. onNofaceDetectedInNIR参数说明
      名称 类型 描述
      nirData byte[] 红外帧数据。
      width Integer 红外帧数据宽度。
      height Integer 红外帧数据高度。
      nirAngle Integer 图片旋转角度。
      示例代码:见1:N检索调用代码。
  • 人脸1:N检索结果回调

    接口名:onFaceMatched

    接口描述:人脸检索匹配结果回调。
    表 32. onFaceMatched参数说明
    名称 类型 描述
    data byte[] RGB帧数据。
    width Integer RGB帧数据宽度。
    height Integer RGB帧数据高度。
    imageAngle Integer 图片旋转角度。
    cameraRotation Integer 相机旋转角度。
    matchResult FaceMatchResult 匹配结果,极端情况下可能存在多个人的情况,比如双胞胎。
    costTime Long 人脸检索比对耗时,性能分析调试用。
    示例代码:见1:N检索调用代码。
  • 检测到翻拍回调

    接口名:onRecapDetected

    接口描述:检测到翻拍,且初始化时开启了翻拍检测时,会执行这个回调。
    表 33. onRecapDetected参数说明
    名称 类型 描述
    data byte[] RGB帧数据。
    width Integer RGB帧数据宽度。
    height Integer RGB帧数据高度。
    imageAngle Integer 图片旋转角度。
    cameraRotation Integer 相机旋转角度。
    recapScore Float 翻拍得分。
    示例代码:见1:N检索调用代码。
  • 人脸移动时的回调

    接口名:onFaceMoving

    接口描述:检测到人脸在移动时,会回调该函数。
    表 34. onFaceMoving参数说明
    名称 类型 描述
    isMoving Boolean 人脸是否移动。
    示例代码:见1:N检索调用代码。

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失败。