zoukankan      html  css  js  c++  java
  • 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." (不能少了那个句点),

    会显示一个结果如:

    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〉 [下一个词语]
    tessdataconfig目录下新建一个bazaar文件,内容为:
    user_words_suffix user-words 
    最后,把识别命令改为:
    tesseract LAN.new.exp0.tif text -l LAN bazaar

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

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

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

  • 相关阅读:
    网络基础
    socket编程初识
    socket之黏包
    socketserver和socket的补充(验证客户端合法性)
    操作系统介绍
    进程初识和multiprocessing模块之Process
    进程Process之join、daemon(守护)、terminate(关闭)
    进程间通信(队列、管道)、消费者模型和进程池(apply,apply_async,map)
    数字证书私钥sign及验证
    JAVA获取密钥公钥的keytool的使用
  • 原文地址:https://www.cnblogs.com/sosoben/p/sosoben-tesseract.html
Copyright © 2011-2022 走看看