概述

Android 身份证号码识别 (本地,在线,实时),网络识别用的别人的接口,不保障什么时候就用不了了,本地识别基于tess_two,位置对的话识别准确率达到90%以上。

详细

前些天下午没什么事,朋友有个需求,说要识别身份证上面的身份证号码,刚好闲着,就帮他解决了一下,不说多完美,但是至少算是解决需求了,好了,闲话少说。

先来看一下我的DEMO吧

接下来我们一个个介绍

一、联网识别

也是从别人的Demo里截出来的,其实也是用的别人的一个在线接口,但是我看了看应该算“非正常调用”(这个意思大家自己理解吧)。下面分析一下这个方法的优劣点吧。

优点:速度极快,上传照片,会返回身份证上所有信息,包括姓名 地址 出生等等

缺点:“非正常”调用就有一定的不可靠性,如果哪天人家关了或者改了这个接口,就比较尴尬了,当然你可以选择购买人家的正式版。

二、本地识别

基于Tess_two做的识别,这个大家可放心使用。先看一下大概怎么使用吧!

首先引用:

compile 'com.rmtheis:tess-two:6.0.0'

然后使用,其实使用起来很简单,但是要注意几点

1.要在SD卡有他的识别库,这个库你可以理解为一个字典,这个字典可以自己训练,因为我是用的别人训练好的(只包含英文和数字),所以就不说怎么训练了,百度一下会有很多。

2.需要注意的是,放他字典的路径文件夹名必须为“tessdata”,否则报错

好了,准备工作做好了,接下来介绍怎么使用,我直接贴核心代码,代码有注释,看不懂的留言或者私信我

//训练数据路径,tessdata
static final String TESSBASE_PATH = Environment.getExternalStorageDirectory() + "/";
//识别语言英文
static final String DEFAULT_LANGUAGE = "eng"; /**
* 传SD卡图片路径(当然你们也可以传Bitmap)
* @param url
*/
private void localre(String url) {
//把图片转为Bitmap
Bitmap bmp = BitmapFactory.decodeFile(url);
//创建Tess
final TessBaseAPI baseApi = new TessBaseAPI();
//下面这一块代码为裁取身份证号码区域(否则识别乱码,不准确)
int x, y, w, h;
x = (int) (bmp.getWidth() * 0.340);
y = (int) (bmp.getHeight() * 0.800);
w = (int) (bmp.getWidth() * 0.6 + 0.5f);
h = (int) (bmp.getHeight() * 0.12 + 0.5f);
Bitmap bit_hm = Bitmap.createBitmap(bmp, x, y, w, h);
//这个只是我将裁取的号码区展示在了一个ImageView上,这个可以没有
iv_number.setImageBitmap(bit_hm);
//初始化OCR的训练数据路径与语言
baseApi.init(TESSBASE_PATH, DEFAULT_LANGUAGE);
//设置识别模式
baseApi.setPageSegMode(TessBaseAPI.PageSegMode.PSM_SINGLE_LINE);
//设置要识别的图片
baseApi.setImage(bit_hm);
//设置字典白名单
baseApi.setVariable("tessedit_char_whitelist", "0123456789Xx");
//把识别内容设置到EditText里
tv_result.setText(baseApi.getUTF8Text());
//收尾
baseApi.clear();
baseApi.end();
}

OK,就这么简单,图片清晰切裁取区域正确的情况下,准确度几乎100%;

给大家举个身份证照片的例子吧,否则裁取号码会不

上一张结果图

实时识别

其实就是本地识别的拓展版,把摄像头的数据转为Bitmap,去识别,还是贴核心代码吧,看不懂的自己下Demo研究。

/**
* 摄像头数据回调
* @param data
* @param camera
*/
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
camera.addCallbackBuffer(data);
//将byte数组转为Bitmap
ByteArrayOutputStream baos;
byte[] rawImage;
Bitmap bitmap;
Camera.Size previewSize = camera.getParameters().getPreviewSize();//获取尺寸,格式转换的时候要用到
BitmapFactory.Options newOpts = new BitmapFactory.Options();
newOpts.inJustDecodeBounds = true;
YuvImage yuvimage = new YuvImage(
data,
ImageFormat.NV21,
previewSize.width,
previewSize.height,
null);
baos = new ByteArrayOutputStream();
yuvimage.compressToJpeg(new Rect(0, 0, previewSize.width, previewSize.height), 100, baos);// 80--JPG图片的质量[0-100],100最高
rawImage = baos.toByteArray();
//将rawImage转换成bitmap
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.RGB_565;
bitmap = BitmapFactory.decodeByteArray(rawImage, 0, rawImage.length, options);
if (bitmap == null) {
Log.d("zka", "bitmap is nlll");
return;
} else {
//裁取图片中央身份证区域
int height = bitmap.getHeight();
int width = bitmap.getWidth();
final Bitmap bitmap1 = Bitmap.createBitmap(bitmap, width/2 - dip2px(150),height / 2 - dip2px(92), dip2px(300), dip2px(185));
//截取身份证号码区域
int x, y, w, h;
x = (int) (bitmap1.getWidth() * 0.340);
y = (int) (bitmap1.getHeight() * 0.800);
w = (int) (bitmap1.getWidth() * 0.6 + 0.5f);
h = (int) (bitmap1.getHeight() * 0.12 + 0.5f);
Bitmap bit_hm = Bitmap.createBitmap(bitmap1, x, y, w, h);
// 识别
if(bit_hm != null){
String localre = localre(bit_hm);
if (localre.length() == 18) {
Log.e(TAG, "onPreviewFrame: "+localre );
Toast.makeText(getApplicationContext(),localre,Toast.LENGTH_SHORT).show();
}
}
}
} /**
* 识别
* @param bm
* @return
*/
private String localre(Bitmap bm) {
String content = "";
bm = bm.copy(Bitmap.Config.ARGB_8888, true);
iv_result.setImageBitmap(bm);
TessBaseAPI baseApi = new TessBaseAPI();
baseApi.init(TESSBASE_PATH, DEFAULT_LANGUAGE);
//设置识别模式
baseApi.setPageSegMode(TessBaseAPI.PageSegMode.PSM_SINGLE_LINE);
//设置要识别的图片
baseApi.setImage(bm);
baseApi.setVariable("tessedit_char_whitelist", "0123456789Xx");
Log.e(TAG, "localre: "+ baseApi.getUTF8Text());
content = baseApi.getUTF8Text();
baseApi.clear();
baseApi.end();
return content;
}

三、源码包截图

四、其他

Ok,就这样吧!核心也就这些东西,有问题的可以留言或私信,有好的解决办法也可以交流,,出于隐私,就把人家的信息打码, 不过识别出来准确度是100%。

注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权

Android 识别身份证号码(图片识别)的更多相关文章

  1. python 识别身份证号码

    # !/usr/bin/python # -*-coding:utf-8-*- import sys import time time1 = time.time() from PIL import I ...

  2. java利用Tesseract 识别身份证号码

    安装Tesseract http://blog.csdn.net/hiredme/article/details/50894814 http://blog.csdn.net/yoara/article ...

  3. 基于python图片识别工具(图片识别,车牌,PDF,验证码)

    先上图  不多说. 对于一般的用户来说识别率还是能达到百分之90以上. 已经打包成exe文件.windows用户可以直接使用.要软件的加我QQ python代码: # -*- coding: UTF- ...

  4. iOS身份证号码识别

    一.前言   身份证识别,又称OCR技术.OCR技术是光学字符识别的缩写,是通过扫描等光学输入方式将各种票据.报刊.书籍.文稿及其它印刷品的文字转化为图像信息,再利用文字识别技术将图像信息转化为可以使 ...

  5. Android ocr识别文字介绍(文字识别)

    最近在做身份证号码识别,在网上搜索的一番后发现目前开源的OCR中tesseract-ocr算是比较强大的了,它由HP于1985年到1995年间开发,后来由google直接负责,经过谷歌进一步开发后,目 ...

  6. Android ORC文字识别之识别身份证号等(附源码)

    项目地址https://github.com/979451341/OrcTest 我们说说实现这个项目已实现的功能,能够截图手机界面的某一块,将这个某一块图片的Bitmap传给tess-two的代码来 ...

  7. Android开发学习之路-GSON使用心得(OCR图片识别)

    在安卓中解析JSON串可以使用的方法有很多,比如说用官方提供的JSONObject或者谷歌提供的开源库GSON,以及一些第三方开源库. 这里用的是GSON,为了测试方便,借助了一个百度的api,一个图 ...

  8. Android安卓身份证识别SDK

    一.Android安卓身份证识别SDK应用背景 这些年,随着互联网金融的极速发展,第三方支付.理财.P2P网贷.征信等APP应用成爆发式的增长,在众多APP中都涉及到对身份证信息的录入,如第三方支付. ...

  9. 身份证识别OCR,开启视频模式扫一扫即可识别身份证信息

    文章摘要:身份证识别等证件识别OCR技术在各个行业得到广泛应用,例如:车险移动查勘会用到身份证识别.行驶证识别.车架号识别: 寿险移动展业会用到名片识别.银行卡识别:电信实名制代理网点采集身份证信息会 ...

随机推荐

  1. 实用在线小工具 -- JS代码压缩工具

        实用在线小工具 -- JS代码压缩工具 将JS代码进行压缩可以减少内存占用,下面链接是一个在线JS代码压缩工具,它将多余的空格和换行符压缩了. JS代码压缩工具链接:http://jspack ...

  2. [转]Android中的android:layout_width和android:width

      android:width 其实是定义控件上面的文本(TextView) 的宽度,当然这个宽度也是和 android:layout_width 配合起来作用的,如果 android:layout_ ...

  3. Java Web UI框架

    1.Aliceui Aliceui是支付宝的样式解决方案,是一套精选的基于 spm 生态圈的样式模块集合,是 Arale 的子集,也是一套模块化的样式命名和组织规范,是写 CSS 的更好方式. git ...

  4. Web前端面试题小集

    一.一个页面上两个div左右铺满整个浏览器,要保证左边的div一直为100px,右边的div跟随浏览器大小变化(比如浏览器为500,右边div为400,浏览器为900,右边div为800),请写出大概 ...

  5. JLInk 各种版本图片收集

    所有图片来自网络, 版权归原始所有者拥有. JLink V5 JLink V6 JLink V7 JLink V8 JLink V9 JLink Ultra JLink Pro

  6. IDA设置函数类型

    http://www.2cto.com/shouce/ida/1361.htm Action name: SetType 该命令允许你指定当前条目类型. 如果光标处在函数内部,那么函数类型将会被编辑, ...

  7. @ResponseBody,@RequestBody,@PathVariable

    最近需要做些接口服务,服务协议定为JSON,为了整合在Spring中,一开始确实费了很大的劲,经朋友提醒才发现,SpringMVC已经强悍到如此地步,佩服! 相关参考: Spring 注解学习手札(一 ...

  8. Eclipse配置Struts2问题:ClassNotFoundException: org...dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

    我的解决方案 一开始,我是依照某本教材,配置了User Libraries(名为struts-2.2.3, 可供多个项目多次使用), 然后直接把struts-2.2.3引入过来(这个包不会真正的放在项 ...

  9. Android开发:ListView加上长按事件

    为ListView加上长按事件 lvMain.setOnItemLongClickListener(new OnItemLongClickListener() { @Override public b ...

  10. asp中将系统货币符号¥改为美国货币符号$的做法

    我们一般用FormatCurrency()函数得到字符串前面都会加上人民币符号¥.但在做一些网站时想把他们变成$. 可以在网面的前面加上一名话就OK了 SetLocale("en-us&qu ...