这玩意儿就只有一个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))
再次测试稍许提高了识别率,好,成功达成目标