安卓OCR之数字英文扫描识别

安卓OCR之数字英文扫描识别

项目有个需求,有关证明的编号录入比较繁琐。基于支付宝可以扫描识别银行卡号,我觉得通过扫描并识别可以达到这一需求,以下文(dan)章(teng)即来源于此。

无一例外的,需要图片识别就必须用到OCR引擎,还必须是开源的(逃...那目标就很明确了,google/百度之,发现谷歌大厂有一个Tesseract项目(基于C++),兴奋之余遂继续寻找其android分支,好在终于找到了tesstwo。开始干活^0^

...

...

...

其实并没有,机缘巧合下我在网上找到一个很有用的demo(需要FQ),它的效果是这样的:demo效果

于是,我下载其源码,试图在本地重现一下。但悲剧的是,这个demo是基于gradle构建的,虽然我试遍了IDEA和Android Studio,还是不行,遂作罢。

回到最初,将tesstwo源码编译出.so文件才是当务之急。在试过这篇博客中的方法后,不行...继续寻觅,终于我在安装了NDK的Android Studio中编译成功,编译好的库文件有多个,取armeabi目录中的全部so文件。

接下来,在Eclipse里新建项目(原谅我实在不会gradle),使用上述demo的代码,并引入编译好的so文件(记得带着armeabi目录),除除错,再运行一下~好了,终于看到了gif中的效果。

到这里算是实现了一大步/一小步,但这个demo不是扫描自动识别的,我们需要类似于二维码扫描识别的效果。自然而然的,我想到了zxing(又是谷歌大厂的)。

类似于这种扫描+识别的功能,我觉得应该是这样一个流程

对焦→拍照→裁剪→有效部分→调用算法识别→成功/失败→返回结果/继续对焦

扒出项目中zxing的源码看了一遍,印证了我的猜想。那么问题就很简单了,我们只需要改动裁剪和调用的算法就能达到目的了。

裁剪这部分在zxing/camera/CameraManager.java中的getFramingRect()方法中,设定其宽高即可(其实就是取景框的宽高)。

至于修改调用的算法则是在DecodeHandler.java中的decode()方法中,在此方法中我们会得到一个PlanarYUVLuminanceSource类的实例,调用该实例的renderCroppedGreyscaleBitmap()方法就会返回相应的BitMap对象,有了该对象之后,我们就可以使用tesstwo的API(或者上述demo对tesstwo的API的封装tessEngine)得到识别后的结果。如果结果与我们的预期符合(我传入一个正则表达式来实现),就可以将结果返回了。结果返回的过程以及接受结果的方法handleDecode()也需要一些处理,在此不再赘述。

插一句题外话,现在很多工具都是需要linux/unix环境支持,虽然在windows中有相应的工具模拟,但不是不方便就是坑比较多,总归不好使。不过现在win10有个自带的ubuntu子系统,大家可以试试~~

posted @ 2016-12-19 10:47 天河流星 阅读(...) 评论(...) 编辑 收藏