Android | 教你如何在安卓上实现通用卡证识别,一键各种卡绑定

摘要:
购物APP用于卡片绑定,通过照片识别快速绑定会员卡、购物卡和折扣卡。如何使用通用卡识别服务为每个人绘制一个简单的流程图。可以看出,您只需要将图片、照片和视频传递给MLKit即可获得相应的识别内容,然后对识别内容进行一定的后处理后,提取需要识别的卡号内容。caseRid.detect_take_photo:这个。startTakePhotoActivity;打破默认值:break;}}视频流标识privatevoidstartCaptureActivity{//创建通用卡标识配置器。MLGcrCaptureConfigcardConfig=newMLGcrCaptureConfig.Factory().Create();//创建通用的卡标识接口配置器。

目录
前言

  华为HMS MLKit提供的服务越来越多了,上期给大家介绍了银行卡识别的功能,从上期的介绍中我们可以了解到使用专用的银行卡识别接口,几行代码就可以完成银行卡卡号的识别,那么有的小伙伴可能会问,我想识别的卡不是银行卡,会员卡可以识别吗,或者某一类证件号识别?也没有问题~但因为不同商家的卡号位置,版面样式各异,所以无法像银行卡识别那样使用专用的银行卡识别API,这个时候我们可以选用通用卡证识别的能力,通用卡证识别可以给大家提供一个标准的通用卡证对准框,大家只需要拉起这个对准框,就可以获取对准框内识别到的卡证全部内容,这个时候再针对这些内容按照一定的规则做关键信息提取,即可获取到自己想要的内容,比如连续的8位数字即为卡号,或者在某些特殊字母后的内容即为卡号内容。

通用卡证识别的应用场景

  通用卡证识别,顾名思义,是各种卡证的识别,能识别的范围很广,常用的应用场景:

  • 旅游绑证
    旅游类APP需要对身份证等信息进行绑定,用于购票、酒店预订等场景,通过对此类证件进行拍照自动识别,可以避免手动输入证件号容易出错的问题。

在这里插入图片描述

  • 购物绑卡
    购物类APP,通过拍照识别快速绑定会员卡、购物卡、打折卡。

在这里插入图片描述

银行卡、中国二代身份证号码识别虽然可以也可以使用通用卡证识别来完成,但推荐使用华为ML Kit的专有的银行卡识别、身份证识别的API,专有卡证识别针对银行卡、身份证识别做了特别的优化,准确率更高,可以直接返回处理好以后的卡号数据,小编后续可以详细介绍下专有卡证和通用卡证识别的区别。

如何使用通用卡证识别服务

在这里插入图片描述
  给大家画了个简单的流程图,可以看到只需要把图片、拍照、视频流传给ML Kit,即可获取到对应的识别内容,针对识别内容做一定后处理即可提取出要识别的卡证号内容。

集成通用卡证识别服务的关键流程

在这里插入图片描述
  可以看到开发流程也非常的简单,只需要启动卡证识别Activity,获取Activity识别到的内容,然后对内容做简单后处理提取关键信息就可以完成代码开发了。

核心提示,端侧能力全免费,全终端覆盖!非华为手机也可以使用

开发实战

  本次的开发实战中实现了对港澳通行证、回乡证、香港居民身份证的处理,大家伙可参考实现。

1 开发准备

详细的准备步骤可以参考华为开发者联盟:
https://developer.huawei.com/consumer/cn/doc/development/HMS-Guides/ml-process-4

这里列举关键的开发步骤。

1.1 在项目级gradle里添加华为maven仓

  打开AndroidStudio项目级build.gradle文件,增量添加如下maven地址:

buildscript {
    repositories {        
        maven {url 'http://developer.huawei.com/repo/'}
    }    }allprojects {
    repositories {       
        maven { url 'http://developer.huawei.com/repo/'}
    }}

1.2 在应用级的build.gradle里面加上SDK依赖

dependencies{  
  // 引入基础SDK 
  implementation 'com.huawei.hms:ml-computer-vision-ocr:1.0.3.300' 
  // 引入拉丁语文字识别模型包 
  implementation 'com.huawei.hms:ml-computer-vision-ocr-latin-model:1.0.3.300' 
  // 引入银行卡识别plugin包 
  implementation 'com.huawei.hms:ml-computer-card-gcr-plugin:1.0.3.300' }

  将以下语句添加到AndroidManifest.xml文件中:

<manifest 
    ... 
    <meta-data              
        android:name="com.huawei.hms.ml.DEPENDENCY"   
        android:value= "ocr"/> 
    ... </manifest>

1.3 配置混淆脚本

按照官网操作指导来就行了:
https://developer.huawei.com/consumer/cn/doc/development/HMS-Guides/ml-configuringobfuscation-scripts-4

1.4 在AndroidManifest.xml文件里面申请相机和存储权限

都是些基本操作,废话也不多说,按照官网指导来操作:
https://developer.huawei.com/consumer/cn/doc/development/HMS-Guides/ml-assigning-permissions-4

2 代码开发

2.1 启动卡证识别

@Override 
public void onClick(View v) { 
    switch (v.getId()) { 
        // 相册图片检测按钮。 
        case R.id.detect_picture: 
            this.startLocalImageActivity(cardImage, null, callback); 
            break; 
        // 视频流检测按钮。 
        case R.id.detect_video: 
            this.startCaptureActivity(null, callback); 
            break; 
        // 拍照检测按钮。 
        case R.id.detect_take_photo: 
            this.startTakePhotoActivity(null, callback); 
            break; 
        default: 
            break; 
        } }

视频流识别

private void startCaptureActivity(Object object, MLGcrCapture.Callback callback) { 
    // 创建通用卡证识别配置器。 
    MLGcrCaptureConfig cardConfig = new MLGcrCaptureConfig.Factory().create(); 
    // 创建通用卡证识别界面配置器。 
    MLGcrCaptureUIConfig uiConfig = new MLGcrCaptureUIConfig.Factory()        
        // 设置扫描框颜色。 
        .setScanBoxCornerColor(Color.GREEN) 
        // 设置扫描框中的提示文字,建议少于30个字符。 
        .setTipText("Recognizing, align edges") 
        // 设置识别界面横竖屏,支持三种模式: 
        // MLGcrCaptureUIConfig.ORIENTATION_AUTO:自动模式,由物理感应器决定显示方向。 
        // MLGcrCaptureUIConfig.ORIENTATION_LANDSCAPE:横屏模式。 
        // MLGcrCaptureUIConfig.ORIENTATION_PORTRAIT:竖屏模式。 
        .setOrientation(MLGcrCaptureUIConfig.ORIENTATION_AUTO) 
        .create(); 
    // 方式一:根据自定义的卡证识别界面配置器,创建通用卡证识别处理器。 
    MLGcrCapture ocrManager = MLGcrCaptureFactory.getInstance().getGcrCapture(cardConfig, uiConfig); 
    // 方式二:使用默认界面,创建通用卡证识别处理器。 
    MLGcrCapture ocrManager = MLGcrCaptureFactory.getInstance().getGcrCapture(cardConfig); 
    // 绑定通用卡证识别处理器和处理结果回调函数。 
    ocrManager.capturePreview(this, object, callback); }

拍照识别

private void startTakePhotoActivity(Object object, MLGcrCapture.Callback callback) { 
    // 创建通用卡证识别配置器。 
    MLGcrCaptureConfig cardConfig = new MLGcrCaptureConfig.Factory().create(); 
    // 创建通用卡证识别界面配置器。 
    MLGcrCaptureUIConfig uiConfig = new MLGcrCaptureUIConfig.Factory() 
        // 设置扫描框颜色。 
        .setScanBoxCornerColor(Color.BLUE) 
        // 设置扫描框中的提示文字,建议少于30个字符。 
        .setTipText("Taking picture, align edges") 
        // 设置界面横竖屏,支持三种模式: 
        // MLGcrCaptureUIConfig.ORIENTATION_AUTO:自动模式,由物理感应器决定显示方向。 
        // MLGcrCaptureUIConfig.ORIENTATION_LANDSCAPE:横屏模式。 
        // MLGcrCaptureUIConfig.ORIENTATION_PORTRAIT:竖屏模式。 
        .setOrientation(MLGcrCaptureUIConfig.ORIENTATION_AUTO) 
        .create(); 
    // 方式一:根据自定义的卡证识别界面配置器,创建通用卡证识别处理器。 
    MLGcrCapture ocrManager = MLGcrCaptureFactory.getInstance().getGcrCapture(cardConfig, uiConfig); 
    // 方式二:使用默认界面,创建通用卡证识别处理器。 
    MLGcrCapture ocrManager = MLGcrCaptureFactory.getInstance().getGcrCapture(cardConfig); 
    // 绑定通用卡证识别处理器和处理结果回调函数。 
    ocrManager.capturePhoto(this, object, callback); }

相册图片识别

private void startLocalImageActivity(Bitmap bitmap, Object object, MLGcrCapture.Callback callback) { 
    // 创建通用卡证识别配置器。 
    MLGcrCaptureConfig config = new MLGcrCaptureConfig.Factory().create(); 
    MLGcrCapture ocrManager = MLGcrCaptureFactory.getInstance().getGcrCapture(config); 
    // bitmap 为需要识别的Bitmap类型卡证图像,支持的图片格式包括:jpg/jpeg/png/bmp。 
    ocrManager.captureImage(bitmap, object, callback); }

2.2 对识别后的内容做后处理,进行关键信息提取

  重载onResult, onCanceled, onFailure, onDenied四个方法;onResult表示返回了结果,MLGcrCaptureResult为卡证识别返回的结果,onCanceled 表示用户取消,onFailure 表示识别失败,onDenied 表示相机不可用等场景。

private MLGcrCapture.Callback callback = new MLGcrCapture.Callback() {
        @Override
        public int onResult(MLGcrCaptureResult result, Object object) {
            Log.i(TAG, "callback onRecSuccess");
            if (result == null) {
                Log.e(TAG, "callback onRecSuccess result is null");
                return MLGcrCaptureResult.CAPTURE_CONTINUE;
            }

            GeneralCardProcessor idCard = null;
            GeneralCardResult cardResult = null;
            /*港澳台通行证处理*/            
            if (cardTypeEnum == CardType.PASSCARD) {
                idCard = new PassCardProcessor(result.text);
            /*香港身份证处理*/
            } else if (cardTypeEnum == CardType.HKIDCARD) {
                idCard = new HKIdCardProcessor(result.text);
            /*回乡证处理*/
            } else if (cardTypeEnum == CardType.COMEHOMECARD) {
                idCard = new HomeCardProcessor(result.text);
            }
            if (idCard != null) {
                /*获取处理后的结果*/
                cardResult = idCard.getResult();
            }

            showFrontImage(result.cardBitmap);
            displayResult(cardResult);

            // If the results don't match
            if (cardResult == null || cardResult.valid.isEmpty() || cardResult.number.isEmpty()) {
                return MLGcrCaptureResult.CAPTURE_CONTINUE;
            }

            displayResult(cardResult);
            return MLGcrCaptureResult.CAPTURE_STOP;
        }       
    };}   
};

  具体的卡号提取处理逻辑可以通过重写GeneralCardProcessor 类中的getResult()方法来完成,以港澳台通行证举例,更加详细的处理可以看github上的源码:

public class PassCardProcessor implements GeneralCardProcessor {
    private static final String TAG = "PassCardProcessor";

    private final MLText text;

    public PassCardProcessor(MLText text) {
        this.text = text;
    }
    @Override
    public GeneralCardResult getResult() {
        List<MLText.Block> blocks = text.getBlocks();
        if (blocks.isEmpty()) {
            Log.i(TAG, "Result blocks is empty");
            return null;
        }
        ArrayList<BlockItem> originItems = getOriginItems(blocks);
        String valid = "";
        String number = "";
        boolean validFlag = false;
        boolean numberFlag = false;
        for (BlockItem item : originItems) {
            String tempStr = item.text;
            if (!validFlag) {
                String result = tryGetValidDate(tempStr);
                if (!result.isEmpty()) {
                    valid = result;
                    validFlag = true;
                }
            }
            if (!numberFlag) {
                String result = tryGetCardNumber(tempStr);
                if (!result.isEmpty()) {
                    number = result;
                    numberFlag = true;
                }
            }
        }        
        return new GeneralCardResult(valid, number);
    } }
Demo 效果

看下Demo效果如何,是不是还不错!
在这里插入图片描述

github 源码

源码已经上传github,大家也可以在github上一起完善该功能。
github源码地址:https://github.com/HMS-MLKit/HUAWEI-HMS-MLKit-Sample

通用卡证识别demo代码路径:
MLKit-Samplemodule-textsrcmainjavacommlkitsampleactivityGeneralCardRecognitionActivity.java

更详细的开发指南参考华为开发者联盟官网
华为开发者联盟机器学习服务开发指南


往期链接:Android | 教你如何在安卓上实现二代身份证识别,一键实名认证
内容来源:https://developer.huawei.com/consumer/cn/forum/topicview?tid=0201226181206630022&fid=18
原作者:AI_talking

免责声明:文章转载自《Android | 教你如何在安卓上实现通用卡证识别,一键各种卡绑定》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇数据库复习IOS 内存管理下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

DHCP Option43配置

在配置Option 43之前,需要保证:1. AP与DHCP服务器之间路由可达,即AP可以获取到IP地址。2. AP与AC之间路由可达,保证AP获取到AC地址后,能够与AC交互信息,建立CAPWAP隧道。 另外,配置人员还需要有基本的数通知识,能够配置DHCP服务器,对AC的配置比较熟悉 下面介绍集中服务器的DHCP配置方式: Microsoft DHCP...

JSONP原理解析

前言 我工作以来接触的第一个项目就是前后端分离的,前端静态文件有自己独立域名,通过接口来获取数据进行渲染等操作。 跨域的方法不需要多言,随便一搜,就有很多,但最常用不外乎jsonp和CORS。jsonp着重于前端,也算是前端Hack技巧,CORS重于后端,服务端需要配置的地方会较多。 这篇解析一下jsonp的实现原理。 基本原理 基本原理很容易说明白,在h...

鲲鹏920的特性

鲲鹏920的特性 鲲鹏920处理器是华为在2019年1月发布的数据中心高性能处理器,由华为自主研发和设计,旨在满足数据中心多样性计算、绿色计算的需求 。鲲鹏920主要运用在服务器上,不要和海思麒麟920弄混了,麒麟系列芯片是运用在手机上。 鲲鹏920处理器兼容ARM架构 采用7nm工艺制造 可以支持32/48/64个内核 主频可达2.6GHz 支持8通...

华为/H3C Syslog配置

H3C交换机的设置举例1. 组网需求将系统的日志信息发送到 linux 日志主机;日志主机的IP 地址为1.2.0.1/16;信息级别高于等于 informational 的日志信息将会发送到日志主机上;日志信息的输出语言为英文,允许输出信息的模块为ARP 和 CMD。2. 组网图3. 配置步骤(1) 设备上的配置。# 开启信息中心。<Sysname...

华为EC321CDMA PCMICA 无线网卡Ubuntu下使用

工作性质的原因,公司配备了华为EC321 CDMA无线网卡,PCMCIA接口。Windows环境下安装好驱动然后通过华为自带的软件可以拨号上网。 Linux下面能不能使用这块网卡呢,答案是肯定的。linux内核中已经包含了很多标准CDMA无线网卡芯片的驱动,只要你使用的CDMA卡是兼容的标准芯片那么在linux环境中使用的可能性很大。其中华为EC321这款...

华为交换机S5720配置nqa+静态路由切换

二、SW2配置nqa test-instance helipay icmptest-type icmpdestination-address ipv4 2.2.2.10 //探测的目标地址frequency 10 //检测周期10秒interval seconds 3 //周期内发的三次包时间间隔,该数值乘于3,不能超过周期设置值start now...