前言

  华为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. 【webpack 系列】基础篇

    Webpack 基础篇 基本概念 Webpack 是一个现代 JavaScript 应用程序的静态模块打包器.当 webpack 处理应用程序时,它会递归地构建一个依赖关系图,其中包含应用程序需要的每 ...

  2. SparkSQL---UDAF

    package sqlspark.Day04 import java.lang import org.apache.spark.sql.{DataFrame, Dataset, SparkSessio ...

  3. 基础组合问题 ————从n个物品里选m个

    package test; import java.util.*; public class Main{ public static int f(int n,int k, int goal){ if( ...

  4. C# NAudio录音和播放音频文件及实时绘制音频波形图(从音频流数据获取,而非设备获取)

    下午写了一篇关于NAudio的录音.播放和波形图的博客,不太满意,感觉写的太乱,又总结了下 NAudio是个相对成熟.开源的C#音频开发工具,它包含录音.播放录音.格式转换.混音调整等功能.本次介绍主 ...

  5. iOS Hook

    HOOK 译为"钩子"或挂钩.在 iOS 逆向中指改变程序运行流程的一种技术. iOS 中 hook 技术的几种方式 Method Swizzle 利用 OC 的 Runtime ...

  6. hive的基本操作与应用

    通过hadoop上的hive完成WordCount 启动hadoop Hdfs上创建文件夹 创建文件夹 上传文件至hdfs 启动Hive 创建原始文档表 导入文件内容到表docs并查看 用HQL进行词 ...

  7. 【tensorflow2.0】处理结构化数据-titanic生存预测

    1.准备数据 import numpy as np import pandas as pd import matplotlib.pyplot as plt import tensorflow as t ...

  8. [HDU]1166敌兵布阵<静态线段树>

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 题目大意:给出n个点,每个点有一个值,现在有三种操作, 1.在i点加上j 2.在i点减去j 3. ...

  9. Pycharm 文件模板配置

    Pycharm 模板配置 #!/usr/bin/python # -*- coding: UTF-8 -*- # Author:${USER} 作者 # FileName:${NAME} 文件名称 # ...

  10. 全网独家:成长经历分享 & 我为什么要写书?

    在当今高速发展的移动互联网+云优先的时代,到处充斥着不可预知的变化,有的来自于客户需求的变化,有的来自于市场环境的变化,面对着这些变化,给企业在市场.渠道.产品.服务各方面都带来了一系列新的挑战,每个 ...