首先我们先来说一下现有的开源的字符识别的工具
参考:https://www.cnblogs.com/wzben/p/5930538.html
tesseract字符识别:
1:安装
tesseract下载地址:https://digi.bib.uni-mannheim.de/tesseract/
进入下载页面,可以看到有各种.exe文件的下其中文件名中带有dev的为开发版本,不带dev的为稳定版本,可以选择下载不带dev的版本,例如可以选择下载tesseract-ocr-setup-3.05.02.exe。下载列表,这里可以选择下载3.0版本。
2:测试
版本打印:tesserct -v 可以看到版本信息。
执行tesseract test.jpg result (test.jpg是测试的图像,result是输出的txt文件,会自己生成的)
3:报错
在安装完tesseract, pytesseract后执行测试命令,发现打印如下错误:
Error opening data file \Program Files (x86)\Tesseract-OCR\tessdata/eng.traineddata
Please make sure the TESSDATA_PREFIX environment variable is set to the parent directory of your "tessdata" directory.Failed loading language 'eng' Tesseract couldn't load any languages! Could not initialize tesseract.
一看上面的提示就是路径有问题,windows路径是\的
解决办法,添加TESSDATA_PREFIX的环境变量,设置为安装目录下的tessdata目录
如:D:\Program Files (x86)\Tesseract-OCR\tessdata
如果还是不行,设置了环境变量可能需要重启下才生效
最快捷的试验方法是,命令行设置环境变量后测试
SET TESSDATA_PREFIX=F:\Tesseract-OCR\tessdata
tesseract 123.png 123.txt
4:乱码问题:
识别中文的时候,发现乱码:
1、下载Tesseract-OCR引擎,注意要3.0以上才支持中文哦,按照提示安装就行。
2、下载chi_sim.traindata字库。要有这个才能识别中文。下好后,放到Tesseract-OCR项目的tessdata文件夹里面。
3、下载jTessBoxEditor,这个是用来训练字库的。
1、进入cmd,进入到要识别的图片的路径下。
2、输入命令
1 |
|
例如我的图片识别就是:
1 |
|
识别完后会生成result.txt文件
效果还行,但是数字和标点几乎全错。
5:重新训练新的模型(在tesseroct基础上)
1、将图片转换成tif格式,用于后面生成box文件。可以通过画图,然后另存为tif即可。
更改图片名字,这个是有要求的=。=
tif文面命名格式[lang].[fontname].exp[num].tif
lang是语言 fontname是字体
比如我们要训练自定义字库 mjorcen字体名normal
那么我们把图片文件重命名 mjorcen.normal.exp0.jpg在转tif。
2、生成box文件。
1 |
|
box文件和对应的tif一定要在相同的目录下,不然后面打不开。
3、打开jTessBoxEditor矫正错误并训练
打开train.bat
找到tif图,打开,并校正。
4、训练。
只要在命令行输入命令即可。
1 |
|
1 |
|
在这我明明已经矫正好了,但是还是有1个字符不能识别出来,报的错跟实际上完全没有相关性,不知道是不是bug,到后面的结果就是“园”字没有识别出来。
先不管,毕竟只有一个样本。
新建一个font_properties文件
里面内容写入 normal 0 0 0 0 0 表示默认普通字体
继续敲命令
1 2 3 4 5 6 7 8 9 |
|
最后会生成五个文件,把目录下的unicharset、inttemp、pffmtable、shapetable、normproto这五个文件前面都加上normal.
如图:
命令行输入,合并五个文件:
1 |
|
得到训练好的字库。
四、测试
1、把 normal.traineddata 复制到Tesseract-OCR 安装目录下的tessdata文件夹中
2、识别命令:
1 |
|
3、效果
对比:
总结:肯定要自己训练过后的字库识别效果好,接下来要把整个项目弄进android,还要研究怎么将多个字库合并成一个字库,因为我不可能一次训练完所有的图片文字的。到时候有什么成果了再分享博文。希望大家可以点赞!谢谢。
更新:没有错误的话命令行的提示应该是这样的