由于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." (不能少了那个句点),

会显示一个结果如:

Combining tessdata files
TessdataManager combined tesseract data files.
Offset for type 0 is -1
Offset for type 1 is 108
Offset for type 2 is -1
Offset for type 3 is 1660
Offset for type 4 is 327545
Offset for type 5 is 327781
Offset for type 6 is -1
Offset for type 7 is -1
Offset for type 8 is -1
Offset for type 9 is -1
Offset for type 10 is -1
Offset for type 11 is -1
Offset for type 12 is –1

必须确定的是第2、4、5、6行的数据不是-1,那么一个新的字典就算生成了。

会生成一个LAN.traineddata 字典文件,然后把这个文件复制到Tessract

的安装目录下一个叫tessdata的文件夹里,就可以使用新的训练字库了
8、使用新的字库 
命令行:tesseract LAN.new.exp0.tif text -l LAN 
打开text.txt,对照原图,发现大部分的字体都可以识别了,但某些地方还是出现
了识别错误。(例如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 ,以让他们不会冲突,但编译的时候就会失败

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