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技术非常专业,一般多是印刷.打印行 ...
随机推荐
- 厉害了,8.7w人打满分!如果我找 BUG 能像他一样厉害就好了!
你好呀,我是歪歪. 最近在 B 站上看到一个让我觉得"非常哇塞"视频的: https://www.bilibili.com/video/BV1y4421U72G/ 视频的播放量有接 ...
- python中的多继承理解
在python的多继承中,父类的初始化顺序遵循所谓方法解析顺序(Method Resolution Order,MRO)的机制.python使用C3线性化算法来确定多继承类的MRO: 1. 目标:创建 ...
- linux bash shell 中的单引号和双引号
摘抄自:ABS_CN 当要引用一个变量的值时,一般推荐使用双引号.使用双引号除了变量名[2]前缀($).后引符(`)和转义符(\)外,会使shell不再解释引号中其它所有的特殊字符.[3] 用双引号时 ...
- JVM源码分析-Java运行
最近在看Java并发编程实践和Inside JVM两本书,发现如果不真正的了解底层运作,那么永远是雾里看花.因此从http://openjdk.java.net/groups/hotspot/上下载了 ...
- Vscode之常用插件
code runner 可以直接在编辑器中运行代码,查看结果,非常方便,一键运行. PHP Intelephense PHP代码提示工具,支付代码提示.查找定义.类搜索等功能,非常强大. php de ...
- Pro更改启动界面
该方法适用于arcgispro 3.1及以上版本,我目前测试到3.3,是可以的. 使用的是pro产品的启动配置文件,利用其中的SplashScreen实现这一需求. 在bin目录下,新建(或编辑)Ar ...
- windows安装tomcat10
下载安装jdk17 :jdk-17_windows-x64_bin.exe 配置JAVA环境变量 JAVA_HOME:C:\Program Files\Java\jdk-17 PATH:%Java_ ...
- Flutter 引用包命名冲突,重复引用
Flutter 引用包命名冲突,重复引用 报错信息 lib/page.dart:92:11: Error: 'Response' is imported from both 'package:get/ ...
- VB 不应该是这副模样出现
和同时代的其它语言比,VB 设计的太烂了,应景之作,充满了各种小聪明. 当时有 JS, 有 python,VB 的设计者不懂参考借鉴,给出的是一个连继承都没有的设计. VB 的语言设计问题极多, 首选 ...
- 【Java】SpringBoot邮件发送实现
Springboot3 邮件发送 哔哩哔哩 萌狼蓝天 微信公众号 萌狼蓝天 依赖 <dependency> <groupId>org.springframework.boot& ...