前言

  华为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-Sample\module-text\src\main\java\com\mlkit\sample\activity\GeneralCardRecognitionActivity.java

更详细的开发指南参考华为开发者联盟官网

华为开发者联盟机器学习服务开发指南


往期链接:Android | 教你如何在安卓上实现二代身份证识别,一键实名认证

内容来源:https://developer.huawei.com/consumer/cn/forum/topicview?tid=0201226181206630022&fid=18

原作者:AI_talking

Android | 教你如何在安卓上实现通用卡证识别,一键各种卡绑定的更多相关文章

  1. Android | 教你如何在安卓上实现二代身份证识别,一键实名认证

    @ 目录 前言 场景 开发前准备 android studio 安装 在项目级gradle里添加华为maven仓 在应用级的build.gradle里面加上SDK依赖 在AndroidManifest ...

  2. Android | 教你如何快速集成机器学习能力

    背景   继上篇博文说了如何快速集成扫码以后 我又上官网去了解了一下其他的功能,其中机器学习服务是当下比较火的,而且还是免费的.就赶紧点进去学习一下.看看能够快速实现哪些功能. 链接在这里:https ...

  3. lighttpd + php for android 安卓上的WEB服务器

    lighttpd + php for android 安卓上的WEBSER 这个项目在 http://hex.ro/wp/blog/php-and-lighttpd-for-android 目前不支持 ...

  4. Android | 教你如何用华为HMS MLKit 图像分割 SDK开发一个证件照DIY小程序

    Android | 教你如何用华为HMS MLKit 图像分割 SDK开发一个证件照DIY小程序 引子   上期给大家介绍了如何使用如何用华为HMS MLKit SDK 三十分钟在安卓上开发一个微笑抓 ...

  5. My First Android Application Project 第一个安卓应用

    一.前言: 安卓(Android):是一种基于Linux的自由及开放源代码的操作系统,主要用在移动设备上,如手机.平板电脑.其他的设备也有使用安卓操作系统,比如:电视机,游戏机.数码相机等等. 二.具 ...

  6. Unity开发Android应用程序:调用安卓应用程序功能

    开发环境: Eclipse3.4 + adt12 + jdk6 + AndroidSDK2.2 Unity3.4 + windows7 测试设备: HTC Desire HD 本文要涉及到的几个重点问 ...

  7. 如何用 Retrofit 2 在安卓上实现 HTTP 访问?

    最近,笔者对安卓开发的兴趣愈发浓厚,而且不断尝试了许多传闻很棒的开发库 -- 大部分也真的很不错.于是打算写一个系列文章,介绍使用这些让人惊叹的库建立安卓示例应用的实践.这样,读者可以自行判断,这些库 ...

  8. Android 教你打造炫酷的ViewPagerIndicator 不仅仅是高仿MIUI

    1.概述 哈,今天给大家带来一个ViewPagerIndicator的制作,相信大家在做tabIndicator的时候,大多数人都用过 TabPageIndicator,并且很多知名APP都使用过这个 ...

  9. 安卓上为什么不能用system.io.file读取streammingAssets目录下的文件

    首先,看文档: Streaming Assets   Most assets in Unity are combined into the project when it is built. Howe ...

随机推荐

  1. 牛客网剑指offer【Python实现】——part1

    斐波那契数列 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,n<=39). 循环实现,时间复杂度n def Fibonacci(self, ...

  2. Python——迭代器的几个高级用法

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第8篇文章. 今天我们依然介绍的是迭代器,不过介绍的是几个比较常用的高级用法,在实际场景当中非常实用,可以帮助我们大 ...

  3. pat 1044.火星数字 Java版

    个人网站:https://www.lingluan.xyz 火星人是以13进制计数的: 地球人的0被火星人称为tret. 地球人数字1到12的火星文分别为:jan, feb, mar, apr, ma ...

  4. 热点 | 近期Github热点项目库总结

    整理 | Walker 介绍:你有没有想过你会成为一个艺术家,但无奈你不知道如何画画?得益于计算机视觉技术,你可以在ML社区轻松实现这个梦想.更棒的是,Github上ML社区的代码都是开源的! 这就是 ...

  5. Python python 五种数据类型--字典

    # 定义一个字典 var1 = {'a':20,'b':40}; var2 = dict(); print(type(var1)) print(type(var2)) # 长度 length = le ...

  6. 深入调研Linq to Objects Join Linq to Entity

    最近工作中遇到数据库组合查询带来的一些问题,因此有必要调研一下Linq to Objects Join Linq to Entity.参考一些网友的代码案例,深入实践了一下使用EntityFramew ...

  7. [bzoj1191]超级英雄hero<二分图匹配*匈牙利算法>

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1191 今天随便在bzoj找了一题做,题一读完就发现是个匈牙利算法的裸题,原本以为可以一次过 ...

  8. Markdown语法快速学习

    Markdown 简洁语法说明 0.前言 一直以来都是以word文档做笔记,存在很多问题,比如代码格式.高亮等.这次公司要求使用markdown,感觉眼前一亮,以前word的问题都得到了解决,而且可以 ...

  9. CodeForces 280B(枚举 + 单调栈应用)

    题目链接 思路如下 这题恶心的枚举任意区间的 最大值及次最大值 ,正常的操作是,是很难实现的,但偏偏有个 单调栈这个动西,能够完成这个任务,跟单调队列相似,有单调 递增.递减的栈,这一题我们需要维护的 ...

  10. oracle实现分页功能 limit功能例子

    oracle数据库不支持mysql中limit功能,但可以通过rownum来限制返回的结果集的行数,rownum并不是用户添加的字段,而是oracle系统自动添加的. 记录两种常用方法: (1)使查询 ...