安卓OCR之数字英文扫描识别
项目有个需求,有关证明的编号录入比较繁琐。基于支付宝可以扫描识别银行卡号,我觉得通过扫描并识别可以达到这一需求,以下文(dan)章(teng)即来源于此。
无一例外的,需要图片识别就必须用到OCR引擎,还必须是开源的(逃...那目标就很明确了,google/百度之,发现谷歌大厂有一个Tesseract项目(基于C++),兴奋之余遂继续寻找其android分支,好在终于找到了tesstwo。开始干活0
...
...
...
其实并没有,机缘巧合下我在网上找到一个很有用的demo(需要FQ),它的效果是这样的:。
于是,我下载其源码,试图在本地重现一下。但悲剧的是,这个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子系统,大家可以试试~~