汪建军的博客

休迅飞凫,飘忽若神,凌波微步,罗袜生尘。

Android developer, sometimes thinking, sometimes try it.


Android下实现身份证正面信息OCR

想要在Android下实现身份证正面信息的OCR,主要的思路就是:

先把照片上身份证的信息逐条切割出来,再用opencv的方法处理一遍,最后利用tess-two的库在异步线程里逐条识别。

关于tess-two

tess-two基于谷歌一款古老的著名OCR开源库-tesseract,目前你能找到的大众型的OCR软件和教程基本上都是基于tesseract。tess-two在它的基础上做了一些改进,提供了非常友好的java api,使其更方便的Android上使用,同时增加了一些文本识别(识别到有文字,同时返回该段文字所在位置的矩形框)、模糊检测、光流检测等功能。能识别各国的文字,当然你得先在这里下载对应的语言包,简体中文库叫:chi_sim.traineddata。有40M,可以放在外部,就是说支持启动App后再下载到手机sdk卡里。

关于使用tess-two做ocr的一些经验

  • 初始化TessBaseAPI和识别都放在线程里,因为中文库很大需要初始化很久,识别时文字越多识别越久。
  • 一次初始化即可,即使删除语言库也可以用,可以用单例或者静态变量。
  • 如果app全程只识别阿拉伯数字就不用下载中文库了,改为一个较小的丹麦语言库:dan_frak,1.5M,同时将TessBaseAPI设置为只识别数字,这样识别起来速度极快。
  • 一次识别尽可能不要太多内容,一行就好,否则像中文这种准确率很糟糕。
  • 识别的准确率依赖你事先对图片的处理效果,比如降噪、灰度化、二值化。
  • 二值化是个坑,慎用,与图片的明暗有关。

第一步:切割身份证单个信息

一个身份证正面包含的信息逐行看的话包括:姓名、性别与民族、出生、住址、公民身份证号码。本文仅以典型的姓名和身份证号为例,其他的也不过是汉字与数字,触类旁通。

首先你得裁剪出图片中的身份证,这个在上一篇博客里有介绍。
接下来把姓名这一栏裁剪出来

最近的文章

Spring Boot(一)入门

Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。简单…

后端继续阅读
更早的文章

Android下实现选取最大矩形-OpenCV与Card.io库

还是公司的项目需求:用户拍照提供银行卡照片,需要自动截取出卡片。当用户对准卡片拍照,那么照片中卡片基本上是在中间而且是整个图片中最大的矩形,那么问题转换为如何截取图片中最大的矩形。 这里提供两种解决途…

杂技继续阅读
comments powered by Disqus