最新消息:欢迎访问Android开发中文站!商务联系微信:loading_in

身份证识别-HMS

热点资讯 loading 126浏览 0评论

概述

App中需要实名认证或是需要绑卡等和金钱交易有关就需要用户提供身份证信息。身份信息手工录入繁琐耗时而且容易出错,所以可以使用自动识别的方式进行录入,方便简单,提升用户体验。其中华为的身份证识别服务提供对中国大陆第二代居民身份证的识别,从带有身份证信息的图像或视频流中,识别出带格式的文本信息,简单高效而且免费。该服务可以对身份证信息做结构化识别和录入,在保险、金融、电商等需要实名认证的行业中广泛应用,不仅可以降低用户身份证信息录入错误的风险,还能以便捷的操作提升用户体验。例如,在金融类应用中使用该服务,可以自动准确识别并录入身份证中的重要信息,有效减少由用户输入错误信息而导致的业务风险。本文将简单介绍一下使用方式。

使用

前期准备工作如果不清楚的可以参考银行卡识别-HMS中的1、2、3、4、5、6、7、8、9

  • 添加依赖。

开发者需要在应用级的“build.gradle”文件中配置相关依赖:

dependencies{
      // 引入身份证plugin与识别能力集合包。(推荐)
      implementation 'com.huawei.hms:ml-computer-card-icr-cn:2.0.3.301'
      // 引入身份证识别plugin包。()
      // implementation 'com.huawei.hms:ml-computer-card-icr-cn-plugin:2.0.3.301'
  }

应用级的“build.gradle”文件头apply plugin: ‘com.android.application’下添加如下配置:

apply plugin: 'com.huawei.agconnect'

还需在AndroidManifest.xml文件中配置自动更新机器学习模型:

<manifest
    ...
    <meta-data
        android:name="com.huawei.hms.ml.DEPENDENCY"
        android:value= "icr"/>
    ...
</manifest>
  • 设置识别参数。

设置识别参数,调用识别器captureFrame接口进行识别:

private void startCaptureActivity(MLBcrCapture.Callback callback) {
    MLBcrCaptureConfig config = new MLBcrCaptureConfig.Factory()
        // 设置银行卡识别期望返回的结果类型。
        // MLBcrCaptureConfig.RESULT_NUM_ONLY:仅识别卡号。
        // MLBcrCaptureConfig.RESULT_SIMPLE:仅识别卡号、有效期信息。
        // MLBcrCaptureConfig.ALL_RESULT:识别卡号、有效期、发卡行、发卡组织和卡类别等信息。
        .setResultType(MLBcrCaptureConfig.RESULT_SIMPLE)
        // 设置识别界面横竖屏,支持三种模式:
        // MLBcrCaptureConfig.ORIENTATION_AUTO: 自适应模式,由物理感应器决定显示方向。
        // MLBcrCaptureConfig.ORIENTATION_LANDSCAPE: 横屏模式。
        // MLBcrCaptureConfig.ORIENTATION_PORTRAIT: 竖屏模式。
        .setOrientation(MLBcrCaptureConfig.ORIENTATION_AUTO)
        .create();
    MLBcrCapture bankCapture = MLBcrCaptureFactory.getInstance().getBcrCapture(config);
    bankCapture.captureFrame(this, callback);
}
  • 创建识别结果回调函数。

创建识别结果回调函数就是上文中的callback,重载onSuccess,onCanceled,onFailure,onDenied四个方法。onSuccess表示识别成功,MLBcrCaptureResult为识别返回结果,onCanceled表示用户取消,onFailure表示识别失败,onDenied 表示相机不可用等场景:

private MLBcrCapture.Callback callback = new MLBcrCapture.Callback() {
    @Override
    public void onSuccess(MLBcrCaptureResult bankCardResult){
        // 识别成功处理。
    }
    @Override
    public void onCanceled(){
        // 用户取消处理。
    } 
    // 识别不到任何文字信息或识别过程发生系统异常的回调方法。
    // retCode:错误码。
    // bitmap:检测失败的卡证图片。
    @Override
    public void onFailure(int retCode, Bitmap bitmap){
        // 识别失败处理。
  }
    @Override
    public void onDenied(){
        // 相机不支持等场景处理。
    }
};
  • 结果识别分析。

当上文中的回调调用了onSuccess方法时代表识别成功,MLBcrCaptureResult代表识别结果:

public final class MLCnIcrCaptureResult {
    public String name;
    public String sex;
    public String nation;
    public String birthday;
    public String address;
    public String idNum;
    public String authority;
    public String validDate;
    public int sideType;
    public Bitmap cardBitmap;
    ...
}

识别结果具体包含哪些信息上诉参数一目了然。至此默认的身份识别已完成。

  • 端侧身份证识别。

除了上述方法,开发者可以使用端侧身份证识别进行识别:

    private void localAnalyzer() {
        if (this.cardFront == null) {
            this.mTextView.setText("Please take the front photo of IDCard.");
            return;
        }
        // Use customized parameter settings for device-based recognition.
        MLIcrAnalyzerSetting setting = new MLIcrAnalyzerSetting.Factory()
                .setSideType(MLIcrAnalyzerSetting.FRONT)
                .create();
        this.localAnalyzer = MLCardAnalyzerFactory.getInstance().getIcrAnalyzer(setting);
        // Create an MLFrame by using the bitmap. Recommended image size: large than 512*512.
        Bitmap bitmap = this.cardFront;
        MLFrame frame = MLFrame.fromBitmap(bitmap);
        Task<MLIdCard> task = this.localAnalyzer.asyncAnalyseFrame(frame);
        task.addOnSuccessListener(new OnSuccessListener<MLIdCard>() {
            @Override
            public void onSuccess(MLIdCard mlIdCard) {
                // Recognition success.
                ...
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(Exception e) {
                // Recognition failure.
                ...
            }
        });
    }

开发者可以通过提供的自定义参数类MLIcrAnalyzerSetting创建卡证分析器,默认识别正面,开发者可以通过setSideType进行配置。MLIcrAnalyzerSetting.FRONT:值为”FRONT”,即正面。MLIcrAnalyzerSetting.BACK:值为”BACK”,即反面。然后通过android.graphics.Bitmap创建MLFrame,支持的图片格式包括:jpg/jpeg/png/bmp,建议图片尺寸不小于512*512像素。最后将创建的MLFrame对象传递给asyncAnalyseFrame方法进行卡证识别。代码中cardFront就是身份证正面照,照片格式要转化为Bitmap格式的。MLIdCard就是识别结果,具体内容如下:

@KeepOriginal
public class MLIdCard {
    private String name;
    private String sex;
    private String nation;
    private String birthday;
    private String address;
    private String idNum;
    private String authority;
    private String validDate;
    private int retCode;
    private int sideType;
    private Bitmap cardBitmap;
}

具体包含哪些内容也是一目了然,和MLBcrCaptureResult差不多。至此端侧身份证识别完成,开发者可以通过获取图库中的身份证图片进行分析,不必调用相机。

  • 效果。

身份证默认的识别预览图中标记了身份证该放置的位置,但是不允许截屏,本文中不做展示。

总结

  • 身份证识别速度较快,耗能较少,对网络友好。
  • 集成方式多样且简单,开发者无需处理相机视频流数据。

说明

  • 身份证识别服务仅在中国大陆地区支持。
  • 若用户手机已集成HMS Core SDK,调用SDK的身份证识别接口,即可对身份证图片进行识别,但无调用相机直接识别。
  • 本文中相关素材来自于HMS Core 指南

转载请注明:Android开发中文站 » 身份证识别-HMS

您必须 登录 才能发表评论!