基于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. Javascript - 异步操作和读取文件

    node.js读取文件 node.js内置了异步读取文件的模块,可以很方便地读取文件的数据.先创建三个txt文档,在根目录下创建一个readFile.js 输入以下代码,然后在vscode的终端中输入 ...

  2. netty系列之:轻轻松松搭个支持中文的服务器

    目录 简介 netty的HTTP支持 netty中使用HTTP的原理 100 (Continue) Status 为netty搭建HTTP服务器 总结 简介 之前讲了那么多关于netty的文章,都是讲 ...

  3. python常用工具库介绍

    Numpy:科学计算 HOME:  http://www.numpy.org/ NumPy is the fundamental package for scientific computing wi ...

  4. Python安装环境配置和多版本共存

    Python安装环境配置和多版本共存 1.环境变量配置: (1) 右键点击"计算机",然后点击"属性" (2) 然后点击"高级系统设置" ( ...

  5. MySQL实战45讲(10--15)-笔记

    11 | 怎么给字符串字段加索引? 维护一个支持邮箱登录的系统,用户表是这么定义的: mysql> create table SUser( ID bigint unsigned primary ...

  6. NOI2021 游记

    day -10 开始一天一场NoIP模拟赛,前几场每天挂分很厉害(这么说是因为后面的以前做过) 自省选惨挂以后国赛的知识点就几乎没怎么摸过了,考前发现连manacher都不会写了,反演?又陷入&quo ...

  7. Model 特性

    表 1 AssociatedMetadataTypeTypeDescriptionProvider 通过添加在关联类中定义的特性和属性信息,从而扩展某个类的元数据信息. AssociationAttr ...

  8. C# HttpWebResponse 请求常见的状态码

    Accepted 202 等效于 HTTP 状态 202. Accepted 指示已接受请求做进一步处理. AlreadyReported 208 等效于 HTTP 状态 208. AlreadyRe ...

  9. oh,我的老伙计,你看看这近五十个dapr视频

    oh,我的老伙计,你看看这近五十个 dapr 视频.这不就是你想要的视频资料吗?快来捡走吧! 开始了,但是没完全开始 Dapr 是一个可移植的.事件驱动的运行时,它使任何开发人员能够轻松构建出弹性的. ...

  10. NIO.2中Path,Paths,Files类的使用

    Java NIO Java NIO概述 Java NIO(New IO(新io),Non-Blocking IO(非阻塞的io))是从Java 1.4版本开始引入的一套新的IO API,可以替代标准的 ...