前言

现如今,许多app需要智能识别用户提供的身份证图片上的信息来完成一些工作,阿里云刚好提供了这个接口,下面我们实现一个小的demo来和大家学习一下。

效果图:

随便在网上找了两张身份证图片,识别并得到结果,num为空因为这个身份证号码是不存在的,真实身份证是可以得到想要的结果的。

该项目的githup地址为:https://github.com/gumaoqi/ALiYunDemo

你可以去将项目clone下来,然后查看或更改来达到自己的需求。

我的另一篇人脸检测博客地址:https://blog.csdn.net/gumaoqi861469629/article/details/82964050,也是通过阿里云的接口。有兴趣的可以去看一看

申请KEY

这里我在完成了功能后将appcode修改了,你需要自行申请购买才能正常运行,下面先介绍如何申请key。

如下图:

打开阿里云首页---产品---人工智能---点击"通用型卡证类"进入下一个页面---身份证识别模块点击"立即购买"进入下一个页面---如果没有购买点击"立即购买"(阿里云提供了0元500次免费的次数);如果已经购买滑动到下方点击"API简单身份认证调用方法"进入下一个页面---点击"查看我的appcode值"就可以查看想要的信息了。

上代码前先吐槽一下,阿里云给的java的示例代码用的是pom.xml管理依赖,而我们经常使用的是as作为开发工具,用build.gradle管理依赖。且示例代码使用的网络请求方式org.apache.http.httpResponse在Android的版本大于22就不支持了(好像是这样,因为这个原因我根据阿里云的demo改了很久都没能成功),然后我去网上搜索其他人的项目,居然没有一个下载下来是可以用的(可能是我能力不够,配置不来环境),于是决定自己动手写一下,最后我选择了使用retrofit网络请求框架来完成。

代码:


build.gradle

    implementation 'com.squareup.retrofit2:retrofit:2.0.2'//添加retrofit依赖implementation 'com.squareup.okhttp3:okhttp:3.1.2'//由于retrofit依赖okhttp,所以需要添加okhttp依赖implementation 'com.squareup.retrofit2:converter-gson:2.0.2'//由于retrofit网络识别的返回结果的处理需要用到gson,添加依赖

使用retrofit网络请求框架请添加上述三个依赖


AndroidMainfest.xml

<!-- 添加使用网络的权限 -->
<uses-permission android:name="android.permission.INTERNET" />

由于需要网络请求,添加网络权限


activity_main_xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><Buttonandroid:id="@+id/activity_main_bt_one"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="检测第一张" /><Buttonandroid:id="@+id/activity_main_bt_two"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="检测第二张" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><ImageViewandroid:id="@+id/activity_main_iv_one"android:layout_width="240dp"android:layout_height="160dp"android:src="@mipmap/id" /><ImageViewandroid:id="@+id/activity_main_iv_two"android:layout_width="240dp"android:layout_height="160dp"android:src="@mipmap/id2" /></LinearLayout><TextViewandroid:id="@+id/activity_main_tv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="我是用来显示识别结果的" /></LinearLayout>

布局很简单,两个button用于点击,两个imageview用于展示图片,一个textview用于显示识别结果。


MainActivity.java

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Base64;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;import com.google.gson.Gson;import java.io.ByteArrayOutputStream;
import java.io.IOException;import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
import retrofit2.http.Body;
import retrofit2.http.Header;
import retrofit2.http.POST;public class MainActivity extends AppCompatActivity {Button buttonOne;Button buttonTwo;TextView textView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);buttonOne = findViewById(R.id.activity_main_bt_one);buttonTwo = findViewById(R.id.activity_main_bt_two);textView = findViewById(R.id.activity_main_tv);buttonOne.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.id);idCardRecognition(bitmap);}});buttonTwo.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.id2);idCardRecognition(bitmap);}});}public void idCardRecognition(Bitmap bitmap) {String appcode = "f785099e36b442aa983a79259735917d";String body = "{\n" +"\t\"image\":  \"" + base64ToNoHeaderBase64(bitmapToBase64(bitmap)) + "\",\n" +"\t\"configure\": \"{\\\"side\\\":\\\"face\\\"}\" \n" +"}";final RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json;charset=UTF-8"), body);Retrofit retrofit = new Retrofit.Builder().addConverterFactory(GsonConverterFactory.create(new Gson())).baseUrl("http://dm-51.data.aliyun.com/")//接口的默认地址.build();IdTestService idTestService = retrofit.create(IdTestService.class);Call<ResponseBody> call = idTestService.getTestResult(requestBody, "APPCODE " + appcode);call.enqueue(new Callback<ResponseBody>() {@Overridepublic void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {try {textView.setText(response.body().string());} catch (IOException e) {e.printStackTrace();}}@Overridepublic void onFailure(Call<ResponseBody> call, Throwable t) {Log.i("123", t.getMessage());}});}/*** 将Bitmap转换成Base64字符串** @param bitmap* @return*/public static String bitmapToBase64(Bitmap bitmap) {ByteArrayOutputStream bos = new ByteArrayOutputStream();bitmap.compress(Bitmap.CompressFormat.JPEG, 40, bos);//参数100表示不压缩byte[] bytes = bos.toByteArray();//转换来的base64码需要加前缀,必须是NO_WRAP参数,表示没有空格。return "data:image/jpeg;base64," + Base64.encodeToString(bytes, Base64.NO_WRAP);}/*** 将base64的头去掉** @param base64* @return*/public static String base64ToNoHeaderBase64(String base64) {return base64.replace("data:image/jpeg;base64,", "");}public interface IdTestService {@POST("rest/160601/ocr/ocr_idcard.json")//接口字段Call<ResponseBody> getTestResult(@Body RequestBody body,@Header("Authorization") String authorization);}
}

idCardRecognition方法,识别身份证的具体方法,方法内包含了如何构造retrofit的body,如何创建请求。

bitmapToBase64方法和base64ToNoHeaderBase64方法,将bitmap转换成没有头的base64数据。

IdTestService接口,retrofit使用到的接口。@POST标签表示使用post方法请求,后面跟请求的具体地址;@Body标签,请求体,用于携带需要识别的图片的数据;@Header请求头,用于携带appcode。


至此,已成功利用阿里云的接口实现了身份证识别的内容,检测了两张程序中的身份证图片,具体应用时,图片可以来自摄像头、图库和网络,通过人身份证识别达到不同的功能。

博主水平有限,如有指正错误和其他建议请在评论区留言。

后记

可以结合阿里云身份证识别和人脸对比功能,来判断用户上传的头像和身份证是否为同一个人,然后通过活体检测功能判断是否为一个真人(即非图片和视频的人);由于活体检测费用昂贵(1次/1元)且公司的app中没有需求,所以博主没有仔细去研究。有兴趣的朋友可以自己去研究一下,接下来可能会写一篇两张图片人脸对比、身份证图片和人脸图片对比的文章。

身份证识别

Android使用阿里云接口实现身份证识别功能相关推荐

  1. python用百度云接口实现身份证识别

    python可以通过python+Opencv来实现很多文字识别之类的工作,因为OpenCV库的功能可以说是相当强大,很多功能都可以完成.但是实现起来需要自己造轮子,所以很费时间和精力,我们可以直接学 ...

  2. Java实现阿里云OCR的身份证识别等功能具体流程(包括android思路)

    项目中需要使用到身份证识别,所以经过调研后决定从阿里云上购买,在经过我的两天研究和客服对接,我基本把坑全踩完了,所以在此总结一套整体的流程 首先,在我买过之后才发现,阿里云的官网上面有两套ocr,第一 ...

  3. python 验证码识别 阿里云_python实现验证码识别功能

    本文实例为大家分享了python实现验证码识别的具体代码,供大家参考,具体内容如下 1.通过二值化处理去掉干扰线 2.对黑白图片进行降噪,去掉那些单独的黑色像素点 3.消除边框上附着的黑色像素点 4. ...

  4. Android平台上实现身份证识别(通过阿里云Api-印刷文字识别_身份证识别)

    Android平台上实现身份证识别(通过阿里云Api-印刷文字识别_身份证识别) 一: 前言 继上一篇文章有段时间了,上一篇文章的身份证和银行卡的识别时通过本地的opencv库,tess-two库识别 ...

  5. Android平台上实现银行卡识别(通过阿里云Api-印刷文字识别_银行卡识别)

    Android平台上实现银行卡识别(通过阿里云Api-印刷文字识别_银行卡识别) 一: 前言 上一篇文章是通过阿里云Api实现在android中扫描身份证和从相册中选取身份证图片识别身份证信息的功能, ...

  6. springboot整合阿里云ocr对身份证或通用文字进行识别提取

    学习目标: 十分钟学会使用阿里云ocr识别.身份证信息.通用文字.等 环境准备: 创建阿里云账户 开通ocr服务 配置appcode 第一步: 购买对应服务:ocr服务链接 第二步: 导入依赖 < ...

  7. 阿里云 OCR 图片文字识别接口使用案例(java)

    阿里云 OCR 图片文字识别接口使用案例(java) 阿里云官方接口文档 前期需要完成 购买阿里云服务 购买服务 可以购买测试服务.每个阿里云用户可以购买1次免费的500次接口请求进行测试 购买完成之 ...

  8. .Net 调用阿里云接口-识别车牌

    参考文档:生成URL - 阿里云视觉智能开放平台 - 阿里云 参考文档:https://next.api.aliyun.com/api/ocr/2019-12-30/RecognizeLicenseP ...

  9. 阿里云servless实现身份证智能识别Demo

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 前言 servless实现身份证智能识别. 提示:以下是本篇文章正文内容,下面案例可供参考 一.如何快速实现阿里云Servless实现 ...

最新文章

  1. android中DatePicker和TimePicker的使用
  2. 获取某个view的高度或者宽度
  3. Mozilla “Common Voice” 开源语音识别项目
  4. vscode怎么引用css_今天来安装一个骚气的 VS Code 主题
  5. 2014年06月30日
  6. [渝粤题库]西北工业大学统计学
  7. 原子微型结构信息应用到局部图形信息存储的猜想
  8. 【OP放大器】在不拆开OP放大器的情况下查一查它是否坏掉或饱和。
  9. 互联网日报 | 苏宁易购拿下英雄联盟职业联赛赞助权;荣耀游戏本年内将推出;英特尔芯片总设计师辞职...
  10. RabbitMQ学习之基于spring-rabbitmq的RPC远程调用
  11. svn server 配置 与TortoiseSVN、Ankhsvn+VS使用 及 问题
  12. 10万字208道Java经典面试题总结(附答案)
  13. BUUCTF-MISC-黑客帝国~喵喵喵
  14. PHPStudy使用教程及phpstudy安装教程
  15. WPS如何打开pdf目录
  16. 椰子树和平等 文:王小波
  17. 深度学习系列2:框架tensorflow
  18. SPSS创建数据文件
  19. ROS中工作空间和功能包的创建以及发布者Publisher的实现
  20. 硬件设计——外围电路(电源电路)

热门文章

  1. 操作系统真象还原——3.完善MBR
  2. 我的大数据学习知录(1)-Hadoop
  3. 微信小程序开发 | 小程序开发框架
  4. Unity 使用NavMesh实现简易的摇杆功能
  5. FairyGUI摇杆
  6. ArcGIS for AutoCAD 下载安装使用
  7. 启动jupyter notebook报错fatal error C1083: Cannot open include file: ‘sys/un.h‘: No such file or directo
  8. 内网安全--权限维持
  9. 首创STM32 USB主机驱动4G rndis设备
  10. Python从网易云音乐、QQ 音乐、酷狗音乐等搜索和下载歌曲