基于Tesseract组件的OCR识别

背景以及介绍

欲研究C#端如何进行图像的基本OCR识别,找到一款开源的OCR识别组件。该组件当前已经已经升级到了4.0版本。和传统的版本(3.x)比,4.0时代最突出的变化就是基于LSTM神经网络。Tesseract本身是由C++进行编写,但为了同时适配不同的语言进行调用,开放调用API并产生了诸如Java、C#、Python等主流语言在内的封装版本。本次主要研究C#封装版。

项目结构

Tesseract本身由C++编写并开源在Github,在3.X版本中,Tesseract的识别模式为字符识别,该种识别方式识别能力较低,所以在后来的4.X版本中,引入了LSTM(Long short-term memory,长短期记忆神经网络),极大的提升了识别率。为了让不同的语言均能够使用Tesseract进行OCR识别,Tesseract也是开放了API并产生了诸如Java、C#、Python等主流语言在内的封装版本。而本次C#端的封装版也开源在了Github,目前已知的C#封装版已发布在nuget上,封装了对应Tesseract的版本为3.05.02。所以目前的项目结构如下:

Demo实验

环境准备

文本识别数据包准备

因为图像识别本身需要文本识别数据进行匹配,所以我们需要下载对应Tesseract官方的文本数据包:

https://tesseract-ocr.github.io/tessdoc/Data-Files

注意,针对不同版本的Tesseract-OCR(3.X和4.X底层的实现方式不同,所以文本识别数据包是不同的),我们需要找到对应的不同的文本训练数据包,官网为了更好的兼容性,4.X版本的文本数据包是兼容了3.X版本的。

the third set in tessdata is the only one that supports the legacy recognizer. The 4.00 files from November 2016 have both legacy and older LSTM models. The current set of files in tessdata have the legacy models and newer LSTM models (integer versions of 4.00.00 alpha models in tessdata_best).

为了Demo,我下载了中文简体和英文的数据包作为实验对象

开发环境准备

为了实验并对比上面两个封装版本的识别效果,这里在同一解决方案中创建了两个项目:

BaseNewBeta使用的是封装了4.1版本Tesseract的C#封装版Tesseract.4.1.0-beta1,因为该版本还还没有上传只Nuget,所以只能从github上下载,放到本地,然后把对应的C++的底层库(leptonica-1.78.0.dll,tesseract41.dll)放置到了x86和x64文件夹下面且需要输出。

BaseNuget是已经上传至Nuget的封装了底层库3.05.20版本的C#封装版3.3.0.0,因为使用nuget进行组件安装,所以x64和x86的Tesseract组件会在编译输出时候自动输出到对应的生成目录。

核心代码

            if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
//PictureBox控件显示图片
pictureBox1.Load(openFileDialog1.FileName);
//获取用户选择文件的后缀名
string extension = Path.GetExtension(openFileDialog1.FileName);
//声明允许的后缀名
string[] str = new string[] { ".jpg", ".png" };
if (!str.Contains(extension))
{
MessageBox.Show("仅能上传jpg,png格式的图片!");
}
else
{
//识别图片文字
Bitmap img = new Bitmap(openFileDialog1.FileName);
// 构建识别引擎
TesseractEngine orcEngine = new TesseractEngine("./tessdata", "eng");
// 识别并获取文本数据
Page page = orcEngine.Process(img);
richTextBox1.Text = page.GetText();
}
}

最终效果

英文识别效果

先是3.X版本识别:



可以看到文本中还有很多识别的错误的,特别是把英文字符C识别为了括号(。

而封装了新版本的识别结果比起之前更好:

中文识别效果

先是3.X版本识别:



然后是封装的版本:



看的出来,官方的数据包对于中文的识别还是有很大问题的,不过庆幸的是,4.X版本的后的Tesseract支持我们使用的自己的数据进行识别训练。这样一来,虽然该组件还比不上市面上大多数的商业OCR识别,但是我们可以使用训练数据,来训练适用于我们特定业务的文字识别(比如XX码的提取之类)

基于Tesseract组件的OCR识别的更多相关文章

  1. 基于百度云的OCR识别(Python)

    2019年7月3日早上,在百度AI开发者大会上,一个来自山西的青年,将一瓶矿泉水浇在了同样来自山西的李彦宏身上. 可以回顾一下 https://b23.tv/av57665929/p1 ,着实让人一惊 ...

  2. 基于Tesseract实现图片文字识别

    一.简介  Tesseract是一个开源的文本识别[OCR]引擎,可通过Apache 2.0许可获得.它可以直接使用,或者使用API从图像中提取打印的文本,支持多种语言.该软件包包含一个ORC引擎[l ...

  3. Python识别验证码,基于Tesseract实现图片文字识别

    一.简介 Tesseract是一个开源的文本识别[OCR]引擎,可通过Apache 2.0许可获得.它可以直接使用,或者使用API从图像中提取打印的文本,支持多种语言.该软件包包含一个ORC引擎[li ...

  4. Android开发如何轻松实现基于Tesseract的Android OCR应用程序

    介绍 此应用程序使用Tesseract 3的Tesseract OCR引擎,该引擎通过识别字符模式( https://github.com/tesseract-ocr/tesseract )来工作. ...

  5. 基于Tesseract的OCR识别小程序

    一.背景 先说下开发背景,今年有次搬家找房子(2020了应该叫去年了),发现每天都要对着各种租房广告打很多电话.(当然网上也找了实地也找),每次基本都是对着墙面看电话号码然后拨打,次数一多就感觉非常麻 ...

  6. 基于Python实现对PDF文件的OCR识别

    http://www.jb51.net/article/89955.htm https://pythontips.com/2016/02/25/ocr-on-pdf-files-using-pytho ...

  7. 【OCR技术系列之四】基于深度学习的文字识别(3755个汉字)

    上一篇提到文字数据集的合成,现在我们手头上已经得到了3755个汉字(一级字库)的印刷体图像数据集,我们可以利用它们进行接下来的3755个汉字的识别系统的搭建.用深度学习做文字识别,用的网络当然是CNN ...

  8. Python&selenium&tesseract自动化测试随机码、验证码(Captcha)的OCR识别解决方案参考

    在自动化测试或者安全渗透测试中,Captcha验证码的问题经常困扰我们,还好现在OCR和AI逐渐发展起来,在这块解决上越来越支撑到位. 我推荐的几种方式,一种是对于简单的验证码,用开源的一些OCR图片 ...

  9. 【OCR技术系列之四】基于深度学习的文字识别

    上一篇提到文字数据集的合成,现在我们手头上已经得到了3755个汉字(一级字库)的印刷体图像数据集,我们可以利用它们进行接下来的3755个汉字的识别系统的搭建.用深度学习做文字识别,用的网络当然是CNN ...

随机推荐

  1. 使用元数据设计的update、query封装

    package util; import java.lang.reflect.InvocationTargetException; import java.sql.Connection; import ...

  2. Mysql for Mac 安装及环境配置

    一.下载及安装 首先去官网下载mac对应版本的Mysql,尾缀为.dmg的程序包 下载地址:https://dev.mysql.com/downloads/mysql/ 下载完毕后,一步步傻瓜式安装即 ...

  3. elsa core—3.elsa 服务

    在本快速入门中,我们将介绍一个用于设置Elsa Server的最小ASP.NET Core应用程序.我们还将安装一些更常用的activities(活动),如Timer.Cron和sendmail,以能 ...

  4. 类的基础语法阅读【Python3.8官网文档】

    英文官方文档: https://docs.python.org/3.8/tutorial/classes.html 中文官方文档: https://docs.python.org/zh-cn/3.8/ ...

  5. JDK、JRE、JVM的基本介绍

    一 .Java三大版本 JavaSE 标准版(桌面程序.控制台开发-) JavaWE 嵌入式开发(手机.家电-) JavaEE 企业开发(web端.服务器开发-) 二.JDK.JRE.JVM区别 JD ...

  6. Integer-源码

    Integer 是java5 引进的新特性 先上一个小实验: public static void main(String[] args) { Integer a1 = 100; Integer a2 ...

  7. Hamcrest 断言框架

    Hamcrest是一个为了测试为目的,能组合成灵活表达式的匹配器类库.用于编断言的框架,使用这个框架编写断言,提高可读性及开发测试的效率,提供了大量"匹配器"方法,每个匹配器用于执 ...

  8. 【转】.net core开发windows服务

    .net core开发windows服务 文建Blog

  9. JAVA语言程序设计课程评价

    紧张的又短暂的一个学期结束了,这个学期也许将成为我人生中一个重要的转折点,作为一名半路出家的选手,在初次了解Java语言时我感到非常的迷茫与不知所措.因为之前很多同学都是通过假期时间在家自学,刚转入新 ...

  10. 【OI技巧】解决cin、cout因输入输出慢而TLE的问题

    语言本身没有问题!! 语言本身没有问题!! 语言本身没有问题!! C++本来的设计就是将输入输出流和C的标准输入输出挂钩在一起,这样就导致cin,cout输入输出前先要将内容放入缓冲区,最后再由cin ...