Tesseract-OCR使用有感
这玩意儿就只有一个Tesseract.dll 就算有其它的加上x64目录下的另外两个dll leptonica-1.80.0.dll tesseract41.dll也不过几兆而已,但是 但是 但是 加上字库文件可就大了 几十兆 。也充分说明了这玩意儿跟我原先说的一样的主要在于字库的匹配。如果只识别数字英文这种 那你调用百度的库反而是个大包袱还必须联网,近期听到一段话 世界上本没有标准件 行业形成了也就有了标准件。资本主义国家形成了标准件 于是我们也就只有在别人的框框里钻来钻去 始终跳不出这个圈儿,如果你明白原理的话就知道其实是不需要标准件的,造轮子才有乐趣嘛,哇哈哈哈。
使用过程还是很简单的。首先使用nu-get安装Tesseract ,注意搜索的时候标题是tesseract 然后 作者是charles weld 版本是v4.1.1的那个 不要弄错了,我的项目.NetFramework框架是4.0 安装完成后会自动为我们添加tesseract的引用。然后网上随意抄一段函数,功能是给一个图片调用引擎识别图片里的文字:
1 private List<string> GetProductNumberFromImage(string imagePath)
2 {
3 List<string> resultList = new List<string>();//chi_sim
4 //using (var ocr = new TesseractEngine(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "tessdata"), "normal", EngineMode.Default))
5 using (var ocr = new TesseractEngine(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "tessdata"), "eng", EngineMode.Default))
6 {
7 //ocr.SetVariable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");//
8 var pix = PixConverter.ToPix(new Bitmap(imagePath));
9 using (var page = ocr.Process(pix))
10 {
11 string text = page.GetText();
12 if (!string.IsNullOrEmpty(text))
13 {
14 resultList.Add(text);
15
16 }
17 }
18 }
19 return resultList;
20 }
还是那句话 遇事先冷静想想为什么总是有好处的。demo运行不起的时候 仔细看代码tessdata的字符 噢 原来如此 尝试下吧,需要事先下载名为eng.traineddata的语言文件置于你编译好的执行文件目录下的tessdata目录,果然。
还可以使用此语句预定义识别内容
1 ocr.SetVariable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
在数字和英文的情况下识别率还可以的。中文的话就有些惨了。

于是我们需要进行校正 ,说实话校正的过程比上面麻烦多了 又要敲命令又要咋的 麻烦的一逼,需要用到一堆工具。
这些打成包的工具在此地址下载https://sourceforge.net/projects/vietocr/
下载好后我们参照这篇文章进行实施https://www.cnblogs.com/wzben/p/5930538.html
大概过程就是用工具敲dos命令生成box文件 其实也就是一个带方框的字体描述文件 告诉你系统目前是怎样识别的,然后用一个GUI工具 jTessBoxEditor 在界面上对文本的宽高 框选范围调整 对应哪个汉字 进行校正。
当我运行train.bat 运行不起的时候弹出 Windows找不到javaw 的时候咋办啊 不要去纠字面意思 ,估计是需要安装jdk吧 尝试一下安装jdk8 果然如此。训练字库的过程中 报错了 Failed to load font_properties from font_properties ,找到一篇博文 https://blog.csdn.net/dragoo1/article/details/8439272 大概看了下没错就是他了 照着实施 bingo 搞定。

能够进行到这一步说明你还能不厌其烦,还能清晰思考说明你是个合格的程序员。 稍微注意下你会发现问题的关键那就是对于汉字的 宽高判别 和部首偏旁偏旁的区域归并 识别引擎很难判定,该框选的不作为一个字单位处理,不该框选的多框 ,这个对识别率影响很大。就连调用微软office的MODI汉字识别率也不见得多高。关键点就在于每单位字宽高的智能判断,相信百度那些也只不过针对这些点进行解决了的而已。用的是别人的引擎即使开源的这复杂度 字单位宽高智能判断我们是改不动的 这里我们只是按部就班的进行模板训练 以提高识别率。
经历一些麻烦的校正和命令操作得到一个normal.traineddata 文件 ,复制到debug下的tessdata目录。注意字库载入代码更改成normal。
1 using (var ocr = new TesseractEngine(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "tessdata"), "normal", EngineMode.Default))
实际上基于模板匹配的这种规规矩矩的OCR已经是非常非常基础的了,毕竟Tesseract-OCR那只有几兆的体积 连我上面说的文本行检测 汉字智能切割 这种都没有 也有可能是我没找到使用方式 谷歌维护的还支持深度学习应该还是可以的 ,但是目前就我的使用感来说的话一般般只是一个将就用了。 把他吹的多么好又是开源的 因为基本上何耐市面上一个能用的免费的了 其它的已经是垃圾中的垃圾了,其它的商用的别人也不会拿出来给免费用的你说对吧
再次测试稍许提高了识别率,好,zhongguo特色的"差不多任务"差不多先生,成功达成任务目标。交差了事

最后:我们自己训练了一个库,然后有从官网下载好的默认的库。如果上面一折腾不就只能使用我们自己训练的那几个字了吗,岂不是识别率更低 要这样还不如不训练呢,对于这一点网上的所有帖子都没做一个明确的说明 很扯淡。通过下面的初始化方式就能你自己的库+官方字库一起使用,normal是你上面训练出的字库的名称,本人亲测有效。
1 using (var ocr = new TesseractEngine(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "tessdata"), "normal+eng", EngineMode.Default))
最后在生产实测中遇到了不少坎坷 憋出了一身汗,好歹还是解决了,事实证明幸好没用office的OCR识别 要不然真挂了 黑盒特性太严重了。这个虽然也很一般但是好歹还是有些可自定义化的参数选项 有实际测量值的结果供你筛选 。打个比方比如加一个自定义逻辑 识别对象的宽高小于多少 我们认为它是一个噪点 把它忽略。还有在最后的测试中为了让容错率大点避免识别失败 把模板字库的每个字弄得很胖 结果经常出现识别错误比如3识别成9, 最后实践的经验证明取一个“合体”的字模可以让识别率提高 。
几经调校 加入了更精细化的识别过程控制 还是基本能够满足生产环境需求。
以此经验分享给盆友们愿大家少走一些弯路。
Tesseract-OCR使用有感的更多相关文章
- tesseract ocr文字识别Android实例程序和训练工具全部源代码
tesseract ocr是一个开源的文字识别引擎,Android系统中也可以使用.可以识别50多种语言,通过自己训练识别库的方式,可以大大提高识别的准确率. 为了节省大家的学习时间,现将自己近期的学 ...
- Tesseract——OCR图像识别 入门篇
Tesseract——OCR图像识别 入门篇 最近给了我一个任务,让我研究图像识别,从我们项目的screenshot中识别文字信息,so我开始了学习,与大家分享下. 我看到目前OCR技术有很多,最主要 ...
- Tesseract Ocr引擎
Tesseract Ocr引擎 1.Tesseract介绍 tesseract 是一个google支持的开源ocr项目,其项目地址:https://github.com/tesseract-ocr/t ...
- 开源图片文字识别引擎——Tesseract OCR
Tessseract为一款开源.免费的OCR引擎,能够支持中文十分难得.虽然其识别效果不是很理想,但是对于要求不高的中小型项目来说,已经足够用了. 文字识别可应用于许多领域,如阅读.翻译.文献资料的检 ...
- Python下Tesseract Ocr引擎及安装介绍
1.Tesseract介绍 tesseract 是一个google支持的开源ocr项目,其项目地址:https://github.com/tesseract-ocr/tesseract,目前最新的源码 ...
- Tesseract OCR使用介绍
#Tesseract OCR使用介绍 ##目录[TOC] ##下载地址及介绍 官网介绍:http://code.google.com/p/tesseract-ocr/wiki/TrainingTess ...
- selenium使用笔记(二)——Tesseract OCR
在自动化测试过程中我们经常会遇到需要输入验证码的情况,而现在一般以图片验证码居多.通常我们处理这种情况应该用最简单的方式,让开发给个万能验证码或者直接将验证码这个环节跳过.之前在技术交流群里也跟朋友讨 ...
- alfresco install in linux, and integrated with tesseract ocr
本文描述在Linux系统上安装Alfresco的步骤: 1. 下载安装文件:alfresco-community-5.0.d-installer-linux-x64.bin 2. 增加执行权限并执行: ...
- 使用Tesseract OCR识别验证码
1.下载Tessrac OCR,默认安装 2.把验证码code.jpg图片放在D盘 3.打开cmd,进入D盘,输入:tesseract code.jpg result 4.进入D盘,生成了resul ...
- Tesseract ocr 3.02学习记录一
光学字符识别(OCR,Optical Character Recognition)是指对文本资料进行扫描,然后对图像文件进行分析处理,获取文字及版面信息的过程.OCR技术非常专业,一般多是印刷.打印行 ...
随机推荐
- rustlings v6.0 运行时出现 “ You are trying to run Rustlings using the old method before version 6”
背景 在之前学习 rust 时,使用过一段时间 rustlings 感觉还不错,但是之前的学习只把 rustlings 的题目刷了一半,然后想再从头到尾刷一遍 rustlings 的题目. 在 rus ...
- python获取zabbix监控项图形
python获取zabbix图形 通过zabbix的api接口获取指定时间段的监控项图形 图片示例: 代码示例: # -*- coding: UTF-8 -*- #可根据监控项获取zabbix下所有主 ...
- 自动化部署之Gitlab+Jenkins+Docker
总结自动发布流程: Gitlab+Jenkins+Docker 一般部署方式: 1.外挂方式: 就是将实际的代码挂载到宿主机上,docker中提供程序运行的环境, 这样的话只需要更新对应的代码就够了 ...
- ThreadLocal-全概念解析
介绍 ThreadLocal 提供线程局部变量,ThreadLocal实例通常是线程私有静态字段,使用的目的是希望将线程与状态关联起来.与JMM中局部变量有几分相似之处,但是不用写回主内存(如果违反, ...
- windows 上部署 kafka 做测试
1.下载 需要下载 zookeeper 和kafka 我下载的版本是 2.部署 2.1 部署 zookeeper 2.1.1 新建配置文件 zoo.cfg 内容为 tickTime = 2000 da ...
- 实用&free的音频格式转化工具
最近写的博客居然是7年前,今天给小朋友下载歌曲时在网上搜了好多格式转化的方法,挨个尝试了之后发现好多是收费的,或者不支持某种格式转化的,但还是大浪淘沙到一些实用的工具.分享给大家参考,同时也督促自己不 ...
- 编译器-FOLLOW集合
语法分析器的两个重要函数 FIRST和FOLLOW 一.FOLLOW的定义 在句型中紧跟在A右边的终结符号的集合 如果A是某些句型的最右符号,那么$在FOLLOW(A)中 A:非终结符 二.计算方法 ...
- Winform跨线程访问报错问题解决
` using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; u ...
- 04C++顺序结构(3)
一.设置域宽setw() 教学视频1 输出的内容所占的总宽度成为域宽,有些高级语言中称为场宽.使用setw()前,必须包含头文件iomanip,即#include.头文件iomanip,用来声明一些& ...
- 使用nvm管理node版本,动态切换不同版本的node(解决安装报错)
使用nvm管理node版本,动态切换不同版本的node 1. 下载nvm安装包 下载地址,点这里进行下载 往下拉,选择 nvm-setup.zip 安装包 2. 安装nvm 注: 安装nvm之前,卸载 ...