[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/

https://img2018.cnblogs.com/blog/753333/201810/753333-20181030134114956-498729297.png

其中文件名中带有 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/

posted @ 2022-12-18 21:08  落痕的寒假  阅读(498)  评论(0编辑  收藏  举报