Tesseract是一个开源的OCR(Optical Character Recognition,光学字符识别)引擎,能够识别多种格式的图像文件并将其转换成文本。眼下已支持60多种语言(包含中文)。 Tesseract最初由HP公司开发,后来由Google维护,眼下公布在Googel Project上。

地址为http://code.google.com/p/tesseract-ocr/

 

使用默认的语言库识别

 

1.安装Tesseract

        从http://code.google.com/p/tesseract-ocr/downloads/list下载Tesseract,眼下版本号为Tesseract3.02。由于仅仅是測试使用,这里直接下载winodws下的安装文件tesseract-ocr-setup-3.02.02.exe。成功安装后会在对应磁盘上生成一个Tesseract-OCR文件夹。通过文件夹下的tesseract.exe程序就能够对图像字符进行识别了。

2.准备一副待识别的图像,这里用绘图工具随便写了一串数字。保存为number.jpg,例如以下图所看到的:

        

3.  打开命令行,定位到Tesseract-OCR文件夹,输入命令:

 

  1. tesseract.exe number.jpg result -l eng  
tesseract.exe number.jpg result -l eng

     当中result表示输出结果文件txt名称,eng表示用以识别的语言文件为英文。

3.  打开Tesseract-OCR文件夹下的result.txt文件。看到识别的结果为7542315857,有3个字符识别错误。识别率还不是非常高,那有没有什么方法来提供识别率呢?Tesseract提供了一套训练样本的方法,用以生成自己所需的识别语言库。以下介绍一下详细训练样本的方法。

 

     

 

训练样本

 

关于怎样训练样本。Tesseract-OCR官网有具体的介绍http://code.google.com/p/tesseract-ocr/wiki/TrainingTesseract3。这里通过一个简单的样例来介绍一下怎样进行样本训练。

 

1.下载工具jTessBoxEditor. http://sourceforge.net/projects/vietocr/files/jTessBoxEditor/,这个工具是用来训练样本用的。因为该工具是用JAVA开发的,须要安装JAVA虚拟机才干执行。

2. 获取样本图像。用绘图工具绘制了5张0-9的文样本图像(当然样本越多越好)。例如以下图所看到的:

  

  

3.合并样本图像。

执行jTessBoxEditor工具。在点击菜单条中Tools--->Merge TIFF。在弹出的对话框中选择样本图像(按Shift选择多张),合并成num.font.exp0.tif文件。

4.生成Box File文件。打开命令行,运行命令:

  1. tesseract.exe num.font.exp0.tif num.font.exp0 batch.nochop makebox  
tesseract.exe num.font.exp0.tif num.font.exp0 batch.nochop makebox

  生成的BOX文件为num.font.exp0.box,BOX文件为Tessercat识别出的文字和其坐标。

注:Make Box File的命令格式为:

  1. tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] batch.nochop makebox  
tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] batch.nochop makebox

当中lang为语言名称,fontname为字体名称,num为序号,能够随便定义。

5.文字校正。执行jTessBoxEditor工具,打开num.font.exp0.tif文件(必须将上一步生成的.box和.tif样本文件放在同一文件夹)。例如以下图所看到的。能够看出有些字符识别的不对,能够通过该工具手动对每张图片中识别错误的字符进行校正。

校正完毕后保存就可以。

 

 

6.定义字体特征文件。Tesseract-OCR3.01以上的版本号在训练之前须要创建一个名称为font_properties的字体特征文件。

font_properties不含有BOM头,文件内容格式例如以下:

  1. <fontname> <italic> <bold> <fixed> <serif> <fraktur>  
<fontname> <italic> <bold> <fixed> <serif> <fraktur>

当中fontname为字体名称。必须与[lang].[fontname].exp[num].box中的名称保持一致。<italic> 、<bold> 、<fixed> 、<serif>、 <fraktur>的取值为1或0。表示字体是否具有这些属性。

这里在样本图片所在文件夹下创建一个名称为font_properties的文件。用记事本打开,输入下面下内容:

 

  1. font 0 0 0 0 0  
font 0 0 0 0 0

这里全取值为0。表示字体不是粗体、斜体等等。

7.生成语言文件。

在样本图片所在文件夹下创建一个批处理文件,输入例如以下内容。

  1. rem 运行改批处理前先要文件夹下创建font_properties文件  
  2.   
  3. echo Run Tesseract for Training..  
  4. tesseract.exe num.font.exp0.tif num.font.exp0 nobatch box.train  
  5.   
  6. echo Compute the Character Set..  
  7. unicharset_extractor.exe num.font.exp0.box  
  8. mftraining -F font_properties -U unicharset -O num.unicharset num.font.exp0.tr  
  9.   
  10. echo Clustering..  
  11. cntraining.exe num.font.exp0.tr  
  12.   
  13. echo Rename Files..  
  14. rename normproto num.normproto  
  15. rename inttemp num.inttemp  
  16. rename pffmtable num.pffmtable  
  17. rename shapetable num.shapetable   
  18.   
  19. echo Create Tessdata..  
  20. combine_tessdata.exe num.  
rem 运行改批处理前先要文件夹下创建font_properties文件

echo Run Tesseract for Training..
tesseract.exe num.font.exp0.tif num.font.exp0 nobatch box.train

echo Compute the Character Set..
unicharset_extractor.exe num.font.exp0.box
mftraining -F font_properties -U unicharset -O num.unicharset num.font.exp0.tr

echo Clustering..
cntraining.exe num.font.exp0.tr

echo Rename Files..
rename normproto num.normproto
rename inttemp num.inttemp
rename pffmtable num.pffmtable
rename shapetable num.shapetable 

echo Create Tessdata..
combine_tessdata.exe num.

将批处理通过命令行运行。运行后的结果例如以下:

需确认打印结果中的Offset 1、3、4、5、13这些项不是-1。这样,一个新的语言文件就生成了。

num.traineddata便是终于生成的语言文件。将生成的num.traineddata复制到Tesseract-OCR-->tessdata文件夹下。

能够用它来进行字符识别了。

 

使用训练后的语言库识别

 

用训练后的语言库识别number.jpg文件。 打开命令行。定位到Tesseract-OCR文件夹,输入命令:

 

  1. tesseract.exe number.jpg result -l eng  
tesseract.exe number.jpg result -l eng

识别结果如如图所看到的,能够看到识别率提高了不少。通过自己定义训练样本,能够进行图形验证码、车牌号码识别等。感兴趣的朋友能够研究研究。