这玩意儿就只有一个Tesseract.dll 就算有其它的加上x64目录下的另外两个dll leptonica-1.80.0.dll tesseract41.dll也不过几兆而已,可是 可是 可是 加上字库文件可就大了 几十兆 。也充分说明了这玩意儿跟我原先说的同样的主要在于字库的匹配。若是只识别数字英文这种 那你调用百度的库反而是个大包袱还必须联网,近期听到一段话 世界上本没有标准件 行业造成了也就有了标准件。资本主义国家造成了标准件 因而咱们也就只有在别人的框框里钻来钻去 始终跳不出这个圈儿,若是你明白原理的话就知道实际上是不须要标准件的,造轮子才有乐趣嘛,哇哈哈哈。html
使用过程仍是很简单的。首先使用nu-get安装Tesseract ,注意搜索的时候标题是tesseract 而后 做者是charles weld 版本是v4.1.1的那个 不要弄错了,个人项目.NetFramework框架是4.0 安装完成后会自动为咱们添加tesseract的引用。而后网上随意抄一段函数,功能是给一个图片调用引擎识别图片里的文字:java
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。spa
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))
以此经验分享给盆友们愿你们少走一些弯路。