[OpenCV实战]35 使用Tesseract和OpenCV实现文本识别
目录
1 如何在Ubuntu和windows上安装Tesseract
1.1 在ubuntu18.04上安装Tesseract4
1.2 在Ubuntu 14.04,16.04,17.04,17.10上安装Tesseract 4.0
1.3 在windows下安装Tesseract 4.0
1.4 检查Tesseract版本
2 Tesseract基本用法
2.1 命令行用法
2.2 使用pytesseract
2.3 使用C ++ API
2.4 语言包错误
3 结果与评价
4 参考
在今天的文章中,我们将学习如何使用名为Tesseract和OpenCV的开源工具识别图像中的文本。从图像中提取文本的方法也称为光学字符识别(OCR)或有时简称为文本识别。Tesseract是由Hewlett Packard Labs开发的专有软件。2005年,惠普与内华达拉斯维加斯大学合作开源。自2006年以来,它一直由谷歌和许多开源贡献者积极开发。
当Tesseract开始支持许多图像格式并逐渐添加大量脚本(语言)时,Tesseract在3.x版本中逐渐完善。Tesseract 3.x基于传统的计算机视觉算法。在过去几年中,基于深度学习的方法在计算机视觉的许多领域中在准确性方面已经超越了传统的机器学习技术。手写识别是一个突出的例子。因此,Tesseract也有一个基于深度学习的识别引擎只是时间问题。在Tesseract4版本中,Tesseract实现了基于长短期记忆(LSTM)的识别引擎。LSTM是一种递归神经网络(RNN)。
注意要识别包含单个字符的图像,我们通常使用卷积神经网络(CNN)。任意长度的文本是字符序列,并且使用RNN解决这些问题,并且LSTM是RNN的流行形式。阅读以下文章以了解有关LSTM的更多信息。
http://colah.github.io/posts/2015-08-Understanding-LSTMs/
Tesseract的第4版也有Tesseract 3的传统OCR引擎,但是LSTM引擎是默认的,我们在这篇文章中专门使用它。Tesseract库附带了一个名为tesseract的便捷命令行工具。我们可以使用此工具对图像执行OCR,输出存储在文本文件中。如果我们想在我们的C
++或Python代码中集成Tesseract,我们将使用Tesseract的API。用法在第2节中介绍,但我们首先从安装说明开始。
1 如何在Ubuntu和windows上安装Tesseract
详细安装操作见:
https://github.com/tesseract-ocr/tesseract/wiki
我们将安装:
Tesseract库(libtesseract)
命令行Tesseract工具(tesseract-ocr)
用于tesseract的Python包装器(pytesseract)
在本教程的后面部分,我们将讨论如何为英语以外的语言安装语言和脚本文件。
1.1 在ubuntu18.04上安装Tesseract4
Tesseract 4包含在Ubuntu 18.04中,因此我们将使用Ubuntu软件包管理器直接安装它。具体命令见:
sudo apt install tesseract-ocr
sudo apt install libtesseract-dev
sudo pip install pytesseract
1.2 在Ubuntu 14.04,16.04,17.04,17.10上安装Tesseract 4.0
由于某些依赖性,只有Tesseract 3可从官方发布渠道获得,适用于早于18.04的Ubuntu版本。幸运的是Ubuntu PPA - alex-p /
tesseract-ocr为Ubuntu版本14.04,16.04,17.04,17.10维护Tesseract
4。我们将这个PPA添加到我们的Ubuntu机器并安装Tesseract。如果您拥有除此之外的Ubuntu版本,则必须从源代码编译Tesseract。具体命令见:
sudo add-apt-repository ppa:alex-p/tesseract-ocr
sudo apt-get update
sudo apt install tesseract-ocr
sudo apt install libtesseract-dev
sudo pip install pytesseract
1.3 在windows下安装Tesseract 4.0
Tesseract本身没有windows的安装包,不过它指定了一个第三方的封装的windows安装包,在其wiki上有说明,大家可直接到这个地址进行下载:
https://digi.bib.uni-mannheim.de/tesseract/
其中文件名中带有 dev 的为开发版本,不带 dev 的为稳定版本。
下载后就是一个exe安装包,直接右击安装即可,安装完成之后,配置一下环境变量,编辑 系统变量里面 path,添加下面的安装路径:
C:\Program Files (x86)\Tesseract-OCR
具体使用安装见:
https://www.cnblogs.com/gl1573/p/9876397.html
https://blog.csdn.net/qq_35531549/article/details/95191677
1.4 检查Tesseract版本
要检查前面的步骤中是否一切正常,请在命令行上尝试以下操作
tesseract –version
你会看到输出类似于
tesseract 4.0.0-beta.1-306-g45b11
leptonica-1.76.0
libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.8
Found AVX2
Found AVX
Found SSE
2 Tesseract基本用法
如前所述,我们可以使用命令行实用程序或使用Tesseract API将其集成到我们的C ++和Python应用程序中。在最基本的用法中,我们指定以下内容
(1) 输入文件名:我们在下面的例子中使用image.jpg。
(2) OCR语言:我们基本示例中的语言设置为英语(eng)。在命令行和pytesseract上,使用-l选项指定它。
(3) OCR引擎模式(oem):Tesseract 4有两个OCR引擎 - 1)Legacy Tesseract引擎2)LSTM引擎。使用该--
oem选项可以选择四种操作模式。0仅限传统引擎、1神经网络仅限LSTM引擎、2 Legacy + LSTM引擎、3默认,基于可用的内容。
(4) 页面分段模式(psm):当您有关于文本结构的其他信息时,PSM非常有用。我们将在后续教程中介绍其中一些模式。在本教程中,我们将坚持使用psm =
3(即PSM_AUTO)。注意如果未指定PSM,则在命令行和python版本中默认为3,但在C ++ API中默认为6。如果使用命令行版本和C ++
API未获得相同的结果,请显式设置PSM。
如果你想查看具体参数,命令行输入
tesseract --help-psm
或者tesseract –help-oem
PSM命令详解:
0 = Orientation and script detection (OSD) only.
1 = Automatic page segmentation with OSD.
2 = Automatic page segmentation, but no OSD, or OCR
3 = Fully automatic page segmentation, but no OSD. (Default)
4 = Assume a single column of text of variable sizes.
5 = Assume a single uniform block of vertically aligned text.
6 = Assume a single uniform block of text.
7 = Treat the image as a single text line.
8 = Treat the image as a single word.
9 = Treat the image as a single word in a circle.
10 = Treat the image as a single character.
2.1 命令行用法
以下示例显示了如何使用tesseract命令行工具执行OCR。选择语言为英语,OCR引擎模式设置为1(即仅限LSTM)。
# Output to terminal 输出到终端
tesseract image.jpg stdout -l eng --oem 1 --psm 3
# Output to output.txt 输出到到txt文档
tesseract image.jpg output -l eng --oem 1 --psm 3
2.2 使用pytesseract
在Python中,我们使用pytesseract模块。它只是命令行工具的包装器,其中使用config参数指定了命令行选项。基本使用要求我们先阅读使用OpenCV的图像,并通过图像image_to_string的pytesseract类的方法与语言(ENG)一起。Pytesseract通过pip
install Pytesseract就可以安装。详细使用代码见:
import cv2
import pytesseract
# 图像路径
imPath = 'image/computer-vision.jpg'
# 命令
config = ('-l eng --oem 1 --psm 3')
# Read image from disk 获得彩色图像
im = cv2.imread(imPath, cv2.IMREAD_COLOR)
# Run tesseract OCR on image
text = pytesseract.image_to_string(im, config=config)
# Print recognized text
print(text)
2.3 使用C ++ API
在C ++版本中,我们首先需要包括tesseract / baseapi.h和leptonica/allheaders.h。然后,我们创建一个指向TessBaseAPI类实例的指针。我们将语言初始化为英语(eng),将OCR引擎初始化为tesseract:: OEM_LSTM_ONLY(这相当于命令行选项 --oem1)。最后,我们使用OpenCV读取图像,并使用其SetImage方法将此图像传递给OCR引擎。使用GetUTF8Text()读出输出文本。详细使用代码下:
#include <string>
#include <tesseract/baseapi.h>
#include <leptonica/allheaders.h>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
string outText;
string imPath = "image/receipt.png";
// Create Tesseract object
tesseract::TessBaseAPI *ocr = new tesseract::TessBaseAPI();
/*
Initialize OCR engine to use English (eng) and The LSTM
OCR engine.
There are four OCR Engine Mode (oem) available
OEM_TESSERACT_ONLY Legacy engine only.
OEM_LSTM_ONLY Neural nets LSTM engine only.
OEM_TESSERACT_LSTM_COMBINED Legacy + LSTM engines.
OEM_DEFAULT Default, based on what is available.
*/
// 初始化
ocr->Init(NULL, "eng", tesseract::OEM_LSTM_ONLY);
// Set Page segmentation mode to PSM_AUTO (3)
// Other important psm modes will be discussed in a future post.
// 设置分割模式
ocr->SetPageSegMode(tesseract::PSM_AUTO);
// Open input image using OpenCV
Mat im = cv::imread(imPath, IMREAD_COLOR);
// Set image data
ocr->SetImage(im.data, im.cols, im.rows, 3, im.step);
// Run Tesseract OCR on image
outText = string(ocr->GetUTF8Text());
// print recognized text
cout << outText << endl;
// Destroy used object and release memory
ocr->End();
return 0;
}
Windows下使用tesseract需要编译后使用,编译教程见:
http://www.dengb.com/cjjc/1345780.html
2.4 语言包错误
您可能会遇到错误Error opening data file tessdata/eng.traineddata
它只是意味着语言包(tessdata / eng.traineddata)不在正确的路径中。您可以通过两种方式解决此问题。
1:确保文件位于预期路径中(例如,在linux上,路径为/usr/share/tesseract-ocr/4.00/tessdata/eng.traineddata)。
2:创建目录tessdata,下载eng.traineddata并将文件保存到tessdata/eng.traineddata。然后,您可以指示Tesseract使用查找此目录中的语言包。(这种方法不推荐问题很多)。
如果你想下载新的语言库,下载地址见:
https://github.com/tesseract-ocr/tessdata
3 结果与评价
Tesseract是一种通用的OCR引擎,但是当我们在普通字体的纯白色背景上使用干净的黑色文本时,它最有效。当文本大致水平且文本高度至少为20像素时,它也可以很好地工作。如果文本具有周围边界,则可以将其检测为一些随机文本。具体使用类似于平常OCR软件。如果能够联网建议使用百度云OCR。
所有代码见:
https://github.com/luohenyueji/OpenCV-Practical-Exercise
具体评测见:
https://segmentfault.com/a/1190000012861561?utm_source=tag-newest
如果使用tesseract,在实际工程tesseract错误率很高,识别率极差。一般需要对图像进行各种图像处理后再用tesseract识别,最后根据错误类型进行二次识别。tesseract的错误还是具有一定规律的。另外tesseract识别中文效果并不好,你要制作专门的中文训练集通过jTessBoxEditor.jar去训练它,但是整个制作流程较为复杂。具体见:
https://github.com/tesseract-ocr/tesseract/wiki/TrainingTesseract-4.00
tesseract要想有好的识别效果,就必须有大量的训练样本。但是tesseract对英文支持还是不错的。
4 参考
https://www.learnopencv.com/deep-learning-based-text-recognition-ocr-using-tesseract-and-opencv/
[OpenCV实战]35 使用Tesseract和OpenCV实现文本识别的更多相关文章
- [OpenCV实战]7 使用YOLOv3和OpenCV进行基于深度学习的目标检测
目录 1 YOLO介绍 1.1 YOLOv3原理 1.2 为什么要将OpenCV用于YOLO? 1.3 在Darknet和OpenCV上对YOLOv3进行速度测试 2 使用YOLOv3进行对象检测(C ...
- OpenCV实战:人脸关键点检测(FaceMark)
Summary:利用OpenCV中的LBF算法进行人脸关键点检测(Facial Landmark Detection) Author: Amusi Date: 2018-03-20 ...
- win10 vs2015源码编译opencv、opencv_contrib、Tesseract
1.软件包准备 opencv源码包地址: 官网 github opencv_contrib源码包地址: github Tesseract源码包地址: ...
- [OpenCV实战]50 用OpenCV制作低成本立体相机
本文主要讲述利用OpenCV制作低成本立体相机以及如何使用OpenCV创建3D视频,准确来说是模仿双目立体相机,我们通常说立体相机一般是指双目立体相机,就是带两个摄像头的那种(目就是指眼睛,双目就是两 ...
- [OpenCV实战]49 对极几何与立体视觉初探
本文主要介绍对极几何(Epipolar Geometry)与立体视觉(Stereo Vision)的相关知识.对极几何简单点来说,其目的就是描述是两幅视图之间的内部对应关系,用来对立体视觉进行建模,实 ...
- [OpenCV实战]48 基于OpenCV实现图像质量评价
本文主要介绍基于OpenCV contrib中的quality模块实现图像质量评价.图像质量评估Image Quality Analysis简称IQA,主要通过数学度量方法来评价图像质量的好坏. 本文 ...
- [OpenCV实战]21 使用OpenCV的Eigenface
目录 1 PCA 1.1 方差是什么 1.2 什么是PCA 1.3 什么是矩阵的特征向量和特征值? 1.4 如何计算PCA 2 什么是EigenFaces? 2.1 将图像作为向量 2.2 如何计算如 ...
- [OpenCV实战]14 使用OpenCV实现单目标跟踪
目录 1 背景 1.1 什么是目标跟踪 1.2 跟踪与检测 2 OpenCV的目标跟踪函数 2.1 函数调用 2.2 函数详解 2.3 综合评价 3 参考 在本教程中,我们将了解OpenCV 3中引入 ...
- [OpenCV实战]5 基于深度学习的文本检测
目录 1 网络加载 2 读取图像 3 前向传播 4 处理输出 3结果和代码 3.1结果 3.2 代码 参考 在这篇文章中,我们将逐字逐句地尝试找到图片中的单词!基于最近的一篇论文进行文字检测. EAS ...
随机推荐
- C语言小白刷题
1.有n个评委,他们给出score个分数,请用代码写出平均值,ave代表平均值 2022-10-15 13:17:10 int main() { int n, i =1, score, sum = 0 ...
- 7.httpie
可以使用curl或httpie测试我们的服务器.Httpie是用Python编写的用户友好的http客户端 安装:pip3 install httpie #get请求示例 输入命令:http ht ...
- BootStrap--selectpicker的使用
bootstrap-select,selectpicker 用法详细:通过官方文档翻译 用过selectpicker的都说好~但是网上中文的教程又找不到比较完整的用法,于是去官网看了下 顺便弄过来 ...
- 2流高手速成记(之六):从SpringBoot到SpringCloudAlibaba
咱们接上回 2流高手速成记(之五):Springboot整合Shiro实现安全管理 - 14号程序员 - 博客园 (cnblogs.com) 身边常有朋友说:小项目用PHP.大项目用Java(这里绝无 ...
- 如何在Spring Boot开启事务
说到事务,那什么是事务呢? 事务(Transaction),一般是指要做的或所做的事情. 原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行. ...
- Ubuntu 20.04 开启root权限登陆、网卡配置
个人名片: 对人间的热爱与歌颂,可抵岁月冗长 Github:念舒_C.ying CSDN主页️:念舒_C.ying 个人博客 :念舒_C.ying Ubuntu 20.04 开启root权限登陆.网 ...
- mybatis sql批量插入
insert into jrqf_officialcard (id, budget_unit, money_purpose, economic_type, money, func_subject_na ...
- Day27:异常详解
异常 1.1 异常概述 异常(Exception)指程序运行中出现的不正常情况:文件找不到.网络异常.非法参数等等. 我们通过代码来了解一下: public class Demo{ public st ...
- 【Java并发入门】03 互斥锁(上):解决原子性问题
原子性问题的源头是线程切换 Q:如果禁用 CPU 线程切换是不是就解决这个问题了? A:单核 CPU 可行,但到了多核 CPU 的时候,有可能是不同的核在处理同一个变量,即便不切换线程,也有问题. 所 ...
- 【SQL真题】SQL3:每类视频近一个月的转发量/率
题目: https://www.nowcoder.com/practice/a78cf92c11e0421abf93762d25c3bfad?tpId=268&tqId=2285068& ...