前提:突发情况下需要去了解下“文字的识别”的技术(android 平台下)。然后立马想到的方法有
1.利用现有的SDK.
2.查找开源的技术。
先说说现有的SDK吧。首先找到的是百度云:https://cloud.baidu.com/product/ocr.html
不过测试结果不太理想,他们的做法是拍照->截图->图片转Base64 上传到服务器识别。大多数情况下对手写字体的识别率很低。机打字体还是有一定的成功率的。其他的证件识别就没有测试过。另外提一句就是百度提供的是在一定的次数下是免费的。
具体的实现方式看百度云的文档说明了,不过有一点:在创建app的时候
这个(文字识别包名)是需要钩上的 。不然的话识别不了。
其他的SDK 暂时没有查找咯。
遵循做技术的嘛,看看实现文字识别是用哪里技术实现的。最后发现实现的技术之一是用openCV 加上 google 提供的tess-two (其他的技术实现方式暂不讨论了).大概的思路是
(ps:在这里感谢:shuishuige93 如果提供代码的话越好,可惜只是如果)
处理图像这块是 是由OpenCV-android(ps:http://opencv.org)担任的.版本的话好像到了openCV3.3 。可是我android studio 能下载的是3.1的版本
具体的android studio (android studio 3.0 Beta5 buildToolsVersion:26.0.1)导入方式:
implementation 'org.opencv:OpenCV-Android:3.1.0'
大部分在网的找出的技术文档 和教程 是openCV 的c++ 的 然后就是版本低的,openCv 还分opencv4android,opencvjava.(不过技术都是相同的) ,然而我还是不想用 .cpp 啥的 虽然
android studio 不知道在几版本后提供了更好的NDK开发套件(cmake).但总感觉人家提供了opencv4android 后还得去写c(如果是高手,如要定制化的功能还是要写,咱是小白能最快实现目的就好了,虽然知识很重要).所以我尝试去实现。
1.灰度化 ,二值化
灰度图(Gray Scale Image)又称灰阶图,它是指把白色与灰色按对数关系分为若干等级,称作灰阶。灰度分为256阶,用灰度表示的图像称为灰度图
(感谢shuishuige93 )
详细的描述 灰度化,二值化(http://blog.csdn.net/evsqiezi/article/details/7905436)
实现灰度化方式是OpenCV里的cvtColor(Matsrc, Mat dst, int code); c 下的实现方式。所以百度了 android 灰度化。在这里提供了基于bitmap和opencv的很好的解决方式(http://blog.csdn.net/kazichs/article/details/52914406) (不过这里使用opencv 对应的不是open 3.1 至少我查看了open3.1的代码没有发现 OpenCVLoader.initAsync ,只有openCVLoader.initDebug,这句话肯定要写的,不然会报错滴)
2.膨胀和腐蚀
通俗的说:
膨胀算法使图像扩大一圈。
腐蚀算法使二值图像减小一圈。
腐蚀:删除对象边界的某些像素
膨胀:给图像中的对象边界添加像素
详细的说明 (ps: http://m.blog.csdn.net/u011028345/article/details/76152243 )
Dilate 使用任意结构元素膨胀图像,Erode 使用任意结构元素腐蚀图像.然后又得找。
其实在灰度和二值化的时候 都是通过 org.opencv.imgproc.Imgproc 下的方法进行转变的.其他的都是一些mat 和 bitmap的转换。所以 腐蚀是Imgproc.erode(Mat src, Mat dst, Mat kernel)
膨胀是dilate(Mat src, Mat dst, Mat kernel)
kernel:是一个腐蚀膨胀计算的核心
Mat kernel = Imgproc.getStructuringElement( Imgproc.MORPH_RECT,new Size(2, 2));
当然具体的参数另行参考了。
3.还有一个图形校正
轮廓提取技术
霍夫变换知识
ROI感兴趣区域知识
这个就比较蛋疼.虽然参考
http://www.cnblogs.com/skyfsm/p/6902524.html 图像矫正技术深入探讨(这个应该是个大牛)
http://www.cnblogs.com/panxiaochun/archive/2016/05/20/5512142.html opencv直线检测在c#、Android和ios下的实现方法
https://github.com/johnhany/MOAAP 针对的Android版本从API 19到API 21不等,同时使用的OpenCV库版本也有2.4.9和2.4.10两种。本文给出的代码是在原书代码的基础上,针对Android 7.0(API 24)与OpenCV 3.2进行了修改,补充了一些注释,适当地增加了一些预处理操作,以使代码整体上更合理 (这里面也讲到了霍夫变化)
到此 处理图像 被乱棍打死了。
文字的识别
android studio 中导入
implementation 'com.rmtheis:tess-two:8.0.0'
并且在这里 https://github.com/tesseract-ocr/tessdata 下载相应的语言文字包(英文:eng.traineddata 中文:chi_sim.traineddata),但是一个个包不是30m,就是70 m。所以app在进行文字识别的化 最好用tess 提供的套件自己训练简单的 语言包。
下载好后,放到
当然tessdata 你也可以写其他的名字,语音包首先要移动到内存中,在初始化tess中会查找路径
m_datapath 是指定的文件路径, m_zh_lang 是语言包的名字 ,
并不需要后缀名。
针对识别的话 可以识别mat 或者bitmap
大概吧,就这些。
最后识别的结果。手写文字 差评,整页文字差评,单行截图(寥寥几个文字的)还好的。
所有啊任重而道远啊