tesseract-ocr 学习笔记

由于OCR技术本身属于一个比较复杂比较新颖的技术,比较多软件公司都把它作为
知识产权的一部分,网络上比较难找到开发教材。因此,采用一些现有的OCR识别模块将
有助于减少开发时间,增加研发效率。
对比了一些商业模块与开源模块,觉得其中tesseract-ocr开源模块比较贴合这
次项目的要求(当前项目对文字数量少,只需要找出两机种不同,相对来说精确度要求低)。
tesseract-ocr是一款开源的OCR识别引擎,初期引擎由HP实验室研发,后来贡献给了
开源软件业,后经由Google进行改进,消除bug,优化,重新发布。当前版本为3.02。
其通过不同的语言训练库可以支持多种语言(包括中文、日文)。
从项目地址http://code.google.com/p/tesseract-ocr下载了相应版本的tesseract
项目,发现其源代码为C++,要结合到C#中编程比较麻烦。后来经过编译发现其可以生成
一系列用命令行运行的程序(如:tesseract.exe,mftraining.exe,cntraining.exe等),
命令行运行"tesseract  图片名  输出文件名 -l 字库文件 -psm pagesegmode 配置文件"
可以得到一个txt文件,其中包含文字识别的结果了。初步尝试识别一些标准字体,
结果还算理想,但经过设计的艺术字体就识别率不高了.


所以接下来必须进行对字库进行训练了,查看说明文档,发现训练步骤还是比较多
的,所以详细纪录如下:
1、首先找到各种要识别的文字的截图,格式要是TIF格式
2、用以下命令为每个TIF图像生成box文件,box文件内容为各字符及其边框坐标
tesseract.exe LAN.new.exp0.tif LAN.new.exp0 -l eng batch.nochop makebox
需要注意的是,此坐标的起点为图片左下角,即左下角为X:0  Y:0。
3、此时的Box文件有可能存在识别错误以及字符分割错误,用jTessBoxEditor
软件可比较快速直观的修改
4、把修改好的box文件保存,用以下命令为每个box文件生成tr文件
tesseract LAN.new.exp0.tif LAN.new.exp0 nobatch box.train
5、用unicharset_extractor程序命令行汇总这些box文件生成计算字符集unicharset
unicharset_extractor LAN.new.exp0.box …… LAN.new.exp12.box
6、聚集字符特征, 需先在当前目录下新建文件font_properties 文件内容为:
tick 0 0 0 0 0  意思为:这个语言的字体为普通字体。格式如下:
<fontname> <italic> <bold> <fixed> <serif> <fraktur>  
然后用mftraining生成字符特征文件.unicharset、inttemp、pffmtable
mftraining -U unicharset -O LAN.unicharset   LAN.new.exp0.tr ……
接着用mftraining生成字符形状正常化特征文件normproto
cntraining LAN.new.exp0.tr LAN.new.exp1.tr
7、合并训练文件
把unicharset, inttemp, normproto, pffmtable,shapetable这四个文件加上前缀"LAN."
这里的前缀名就是新训练的语言字库的名字了。
然后使用命令:"combine_tessdata LAN." (不能少了那个句点),
会生成一个LAN.traineddata 字典文件,然后把这个文件复制到Tessract
的安装目录下一个叫tessdata的文件夹里,就可以使用新的训练字库了
8、使用新的字库
命令行:tesseract LAN.new.exp0.tif text -l LAN
打开text.txt,对照原图,发现大部分的字体都可以识别了,但某些地方还是出现
了识别错误。(例如图2的N识别成了R,C012识别成CD12。)

后来经过排除一些训练样品,发现主要是因为受到了同一个字符的不同字体的
影响,例如 LAN TONY中N的字体是不一样的。
解决办法:把LAN的N识别成n,以增加识别率,编程时可把字符变回大写。

至于C012识别成CD12,也是因为有几个图片上的0比较圆润,导致C012识别成了
CD12,这时候我们采取了添加用户自定义字符的方法去修正。做法如下:
tessdata目录下新建一个LAN.user-words文件内容为:
C012 〈换行符/n〉 [下一个词语]
tessdata\config目录下新建一个bazaar文件,内容为:
user_words_suffix user-words
最后,把识别命令改为:
tesseract LAN.new.exp0.tif text -l LAN bazaar

至此,截图中的字母就全部给识别出来了。

但还有一个残留问题,对于不同的字体 我想在同一种语言中分成不同的字体来表示,例如 LAN.new 和 LAN.new1 ,以让他们不会冲突,但编译的时候就会失败

不知道是什么原因,还望网络上的牛人帮忙解答.共同进步! 



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值