踩了不少坑,终于把这个扫描版的身份证识别做出来了,图片识别引擎用的是tesseract,在已经训练好样本的情况下,感觉识别率还是一般般~ 
下面说一说大概几个坑、

一、 编译tesseract-orc Android版本 
首先你需要Android-ndk工具,Android ndk开发,我们这里不做开发,只需要编译tesseract变成so文件、tesseract Android版下载地址,这里只需要编译tesseract-two这个项目、编译方法在那篇博客说的很清楚了,编译时间有点久(耐心等待,并且大部分人在这里会扑街)

二、测试是否编译成功 
新建一个项目,用引用类库的方式引用tesseract-two,API的调用方法也很简单:

  1. TessBaseAPI baseApi=new TessBaseAPI();
  2. //这里进行初始化,第一个参数是训练语言的路径,第二个参数的语言名字,后面我们的训练文件都要放在这里面,这里可以先用eng代替下测试、
  3. baseApi.init(TESSBASE_PATH, DEFAULT_LANGUAGE);
  4. baseApi.setPageSegMode(TessBaseAPI.PSM_AUTO);
  5. //这里把图片放进去进行了
  6. baseApi.setImage(bitmap);
  7. final String outputText = baseApi.getUTF8Text();
  8. Log.i(TAG, "识别结果:" + outputText);
  9. baseApi.end();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

上述就是整个API的调用流程,值得注意的是,该流程是一个耗时操作,不可在UI线程中调用、 
若没有闪退,并且有大概的识别文字出来,表示编译成功,接下来就开始训练新语言。

三、训练新语言,提高识别率 
说到训练语言这个问题,网上的文章是非常多的,不过我却在这里卡了很久,原因是因为网上大部分文章是针对3.01版本训练,而现在版本是3.02,有几个地方死活报错过不去、寻其原因在于文件名的问题!tesseract-orc3.02训练方法 这篇博客已经说的很清楚啦,我再把精简一下: 
图片名字的格式 一定需要按照 [lang].[fontname].exp[num].tif 该格式!用id.custom.exp0.tif 作为示范

1).转成 tif 格式图片,用jTessBoxEditor工具 合成为一张tif图片

2).生成box文件,调用命令行: 
tesseract id.custom.exp0.tif id.custom.exp0 batch.nochop makebox

3).利用jTessBoxEditor工具,对文件进行编辑,校正,得到新的box文件

4).生成.tr文件,调用命令行: 
tesseract id.custom.exp0.tif id.custom.exp0 nobatch box.train

5).生成字符集,调用命令行: 
unicharset_extractor id.custom.exp0.box

6).设置字体,新建文本文件font_properties,里面输入字体信息,内容格式为: 
第一个fontname 一定要对应之前文件的名字, 这里输入 custom 0 1 0 0 0 ,表示是加粗字体格式

7).接下来,进行聚合,分别调用三句命令: 
shapeclustering -F font_properties -U unicharset id.custom.exp0.tr 
mftraining -F font_properties -U unicharset -O id.unicharset id.custom.exp0.tr 
cntraining id.custom.exp0.tr id.custom.exp0.tr

8).把生成第7步生成的4个文件加入前缀“id.”(),调用命令行,生成最终数据 
combine_tessdata id. (别漏掉了.) 
type 1,type3, type4, type5对应的后面数据如果不是-1,就表示这次训练成功!

9).进行测试: 
tesseract id1.jpg output -l id

四、集成到项目中实现拍照识别 
如果上述训练没有问题,那么可以将训练文件 id.traineddata 放在assert文件夹中,当应用程序启动时,将其拷贝到sd卡,这里值得注意的是,拍照返回的图片都比较大,是需要进行压缩的、最终大小尽量和你训练时的大小一致,然后图片进行灰度处理,再调用API来识别。

五、扫描识别 
由于拍照后再识别的准确率实在是低,和拍照的角度,光线,以及拍照时身份证没有填满照片等等因素,很难做到高准确率的识别、于是我就仿造扫描二维码(支付宝扫描银行卡号)的方式,来增加识别次数提高识别率。扫描界面我是借鉴二维码扫描的代码、大致流程: 
需要一个Camera对象来获取相机资源,用一个SurfaceView来显示相机预览,surfaceview启动时获取相机资源,并且实现自动对焦和预览回调接口,自动对焦是定时的,每过1.5秒对焦一次、而在预览回调接口中:

  1. /**
  2. * 拍照回调
  3. */
  4. PreviewCallback previewCallback = new PreviewCallback() {
  5. @Override
  6. public void onPreviewFrame(byte[] data, Camera camera) {
  7. // TODO Auto-generated method stub
  8. if (isChoice) {
  9. new MyOrcTask().execute(data);
  10. isChoice = false;
  11. }
  12. }
  13. };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

我们把图片处理,图片识别放在了异步任务中,因为该接口是不停的回调的、每次传进一张照片进入后,把标志改为false,当异步任务执行完后,把标志改为true,这样就是单线程异步的执行图片识别任务、

  1. /**
  2. * 图片解析的异步任务!
  3. *
  4. * @author kaifa
  5. *
  6. */
  7. class MyOrcTask extends AsyncTask<byte[], Void, Void> {
  8. String text = "";
  9. @Override
  10. protected void onPreExecute() {
  11. // TODO Auto-generated method stub
  12. super.onPreExecute();
  13. }
  14. @Override
  15. protected Void doInBackground(byte[]... params) {
  16. // TODO Auto-generated method stub
  17. byte[] data = params[0];
  18. Size size = camera.getParameters().getPreviewSize();
  19. try {
  20. YuvImage image = new YuvImage(data, ImageFormat.NV21,
  21. size.width, size.height, null);
  22. if (image != null) {
  23. ByteArrayOutputStream stream = new ByteArrayOutputStream();
  24. image.compressToJpeg(
  25. new Rect(0, 0, size.width, size.height), 80, stream);
  26. Bitmap bitmap = BitmapFactory.decodeByteArray(
  27. stream.toByteArray(), 0, stream.size());
  28. bitmap = Bitmap.createBitmap(bitmap, x, y, width, height);
  29. // 去解析
  30. if (bitmap != null) {
  31. bitmap = comp(bitmap);
  32. bitmap = ImageFilter.grayScale(bitmap);
  33. TessBaseAPI baseAPI = new TessBaseAPI();
  34. // 初始化
  35. baseAPI.init(TESSBASE_PATH, DEFAULT_LANGUAGE);
  36. baseAPI.setPageSegMode(TessBaseAPI.PageSegMode.PSM_AUTO);
  37. baseAPI.setImage(bitmap);
  38. text = baseAPI.getUTF8Text();
  39. baseAPI.end();
  40. }
  41. stream.close();
  42. }
  43. } catch (Exception ex) {
  44. Log.e("Sys", "Error:" + ex.getMessage());
  45. }
  46. return null;
  47. }
  48. @Override
  49. protected void onPostExecute(Void result) {
  50. // TODO Auto-generated method stub
  51. super.onPostExecute(result);
  52. text.replaceAll("\n", "");
  53. text = text.trim();
  54. if (text.length() > 18) {
  55. text = text.substring(text.length() - 18, text.length());
  56. if (IDcheckClassUtil.validateIdCard18(text)) {
  57. Toast.makeText(ScanActivity.this, "成功!请核对", 0).show();
  58. isChoice = false;
  59. textView.setText(text);
  60. } else {
  61. // Toast.makeText(ScanActivity.this, "就差一点点啦!", 0).show();
  62. isChoice = true;
  63. }
  64. } else {
  65. // Toast.makeText(ScanActivity.this, "请再对齐一点点哦!", 0).show();
  66. // 继续去选择图片
  67. isChoice = true;
  68. }
  69. }
  70. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85

很多人都要代码,源码在这~

Android tesseract-orc之扫描身份证号码的更多相关文章

  1. Android之利用正则表达式校验邮箱、手机号、密码、身份证号码等

    概述 现在Android应用在注册的时候基本会校验邮箱.手机号.密码.身份证号码其中一项或多项,特此收集了相关的正则表达式给大家分享.除了正则表达式,文章末尾提供Demo中有惊喜哦! 具体验证的图片效 ...

  2. Android 识别身份证号码(图片识别)

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

  3. Android 身份证号码查询、手机号码查询、天气查询

    1.基本信息 身份证号码查询:http://apistore.baidu.com/apiworks/servicedetail/113.html 手机号码:http://apistore.baidu. ...

  4. iOS身份证号码识别

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

  5. 【代码笔记】iOS-由身份证号码返回性别

    一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. ...

  6. Javascript身份证号码验证

    "来来来,坐这儿". "什么?我可是有身份的人,怎么能和你坐一块儿".沛笠晃了晃手里的身份证,不屑说道. "你咋不上天呢?有身份还喝油条吃豆浆&quo ...

  7. php验证身份证号码的正确性

    /********************php验证身份证号码是否正确函数*********************/function is_idcard( $id ) {   $id = strto ...

  8. JS身份证号码校验

    var Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 ]; // 加权因子 var ValideCode = [ 1, 0 ...

  9. js正则实现二代身份证号码验证详解

    js正则实现二代身份证号码验证详解 根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至 ...

随机推荐

  1. 逻辑回归应用之Kaggle泰坦尼克之灾

    机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾 标签: 机器学习应用 2015-11-12 13:52 3688人阅读 评论(15) 收藏 举报 本文章已收录于:  机器学习知识库  分类 ...

  2. Get file extention in XSLT

      When working with data view web parts or data form web parts in SharePoint, you might want to use ...

  3. 阿里云centos配置nginx和nodejs

    今天新买了阿里云,想把网站跑起来,于是记录跑起来的过程 1.购买域名 2.购买解析 3.购买ecs主机 4.ssh登录主机 5.安装vsftpd 6.配置ftp用户.文件夹.权限 7.安装nginx/ ...

  4. [Docker] Driver Bridge network for linking containers

    In previous postwe have seen how to link two container together by using `--link`: # docker run -d - ...

  5. window.btoa

    概述 将ascii字符串或二进制数据转换成一个base64编码过的字符串,该方法不能直接作用于Unicode字符串. 语法 var encodedData = window.btoa(stringTo ...

  6. Android 之 SharedPreferences应用

    Android 平台给我们提供了一个 SharedPreferences 类,它是一个轻量级的存储类,特别适合用于保存共享数据.使用SharedPreferences保存数据,其背后是用xml文件存放 ...

  7. Microsoft® SQL Server® 2008 Express with Tools

    https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=22973

  8. tail -f 和tail -F的区别

    http://flume.apache.org/FlumeUserGuide.html flume抓取 exec 的command 官网有如下建议:

  9. PostgreSQL10.5安装详细步骤(Win10)

    一.PostgreSQL安装: 作者:qq2648008726 来源:CSDN 原文:https://blog.csdn.net/u012325865/article/details/81951916 ...

  10. Percona-XtraBackup系列三:增量备份恢复

    1:创建测试表和测试库如果需要快速建立测试表和库的话,参考之前写的这篇博客:http://www.cnblogs.com/xiaoit/p/3376685.html create database b ...