《OpenCV系列教程》
项目位置:OpenCV-Sample
代码位置:100-OCR.py
今天的博文我们将学习使用开源工具Tesseract+OpenCV,对图片上的文字进行识别。从图片提取文字的方法叫作“光学字符识别”(Optical Character Recognition )简称OCR,也可以简单的叫做文字识别。
Tesseract最初由惠普实验室开发,在2005年惠普与内华达拉斯维加斯大学进行合作的时候对其进行了开源。从2006年起,它被google和众多开源爱好者进行积极的开发和维护。
Tesseract在3.x版本的时候逐渐成熟,它支持多种图片格式并且大量的语言也被添加其中。但是Tesseract3.x是基于传统的计算机视觉算法的。过去的几年中,在众多的计算机视觉领域内,深度学习算法在精准程度上,明显优于传统的机器学习技术。手写识别就是一个很好的例证。因此Tesseract拥有一个基于深度学习的文字识别引擎只是一个时间的问题。
Tesseract在版本4的时候,就实现了一个基于Long Short Term Memory(LSTM网络)的识别引擎。LSTM是循环神经网络(Recurrent Neural Network)中的一种。
初学者需要主要:识别图片中的单个字符,我们通常使用卷积神经网络(Convolutional Neural Network)。但是对于任意长度的字符串呢?解决这个问题的方式使用Rnns和LSTM还是比较受欢迎的方式。这里能你更好的理解LSTM。
在Tesseract版本4中依旧留用了版本3中的OCR引擎,但LSTM变成了默认使用的识别引擎,在后面我们将使用后者进行识别。
Tesseract库附带了一个很方便的命令行工具叫做tesseract。我们可以通过这个工具进行OCR文字识别,并且输出存在在一个txt文件中。如果你想在代码中使用Tesseract你就需要调用他的API。在使用之前我们需要先安装上它。
安装如下:
在教程的后面,我们还会讨论如何安装英语之外的语言脚步文件。
Tesseract已经被Ubuntu18.04内置,所有我们可以直接安装。
sudo apt install tesseract-ocr
sudo apt install libtesseract-dev
sudo apt install tesseract-ocr-chi-sim #对中文的支持
sudo apt install tesseract-ocr-eng #英文的支持
sudo pip install pytesseract
因为依赖关系,比18.04老的版本中,仅仅Tesseract3是有效的。
幸运的是Ubuntu PPA – alex-p/tesseract-ocr 支持了Ubuntu versions 14.04, 16.04, 17.04, 17.10。我们可以添加PPA到我们的系统中,然后进行安装。如果你的ubuntu版本不是上面所述中的任一个,你则需要通过源码编译。
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
我们将使用Homebrew来安装Tesseract。默认Homebrew安装的是Tesseract 3,但我们可以让他安装最新版本。使用如下命令:
# If you have tesseract 3 installed, unlink first by uncommenting the line below
# brew unlink tesseract
brew install tesseract --HEAD
pip install pytesseract
上述的步骤如果我们都做对了,就可以运行下面的命令了
tesseract --version
你会看到类似的输出:
tesseract 4.0.0-115-ge3a3
leptonica-1.76.0
libgif 5.1.4 : libjpeg 8d (libjpeg-turbo 1.4.2) : libpng 1.2.54 : libtiff 4.0.6 : zlib 1.2.8 : libwebp 0.4.4 : libopenjp2 2.3.0
Found AVX2
Found AVX
Found SSE
正如先前提到的,我们使用命令行工具或者在我们的C++、Python中调用API接口。非常基础的使用,我们指定如下内容:
0 Legacy engine only.
1 Neural nets LSTM engine only.
2 Legacy + LSTM engines.
3 Default, based on what is available.
提示:当PSM没有不指定的时候,它的默认值是3.
下面的例子展示了tesseract命令行工具,如何执行OCR操作。 语言选择为英语,OCR引擎设置为1(LSTM)
# Output to terminal
tesseract image.jpg stdout -l eng --oem 1 --psm 3
# Output to output.txt
tesseract image.jpg output -l eng --oem 1 --psm 3
使用Python编程的时候我们使用pytesseract模块。他是命令行工具的简易包装器,通过config这个参数来指定命令行选项。基本操作是我们使用OpenCV提取图像,并将图像转给 pytesseract类中的,image_to_string方法。
import cv2
import sys
import pytesseract
if __name__ == '__main__':
if len(sys.argv) < 2:
print('Usage: python ocr_simple.py image.jpg')
sys.exit(1)
# Read image path from command line
imPath = sys.argv[1]
# Uncomment the line below to provide path to tesseract manually
# pytesseract.pytesseract.tesseract_cmd = '/usr/bin/tesseract'
# Define config parameters.
# '-l eng' for using the English language
# '--oem 1' for using LSTM OCR Engine
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)
在C++版本中,我们首先需要include tesseract/baseapi.h和leptonica/allheaders.h。我们创建了一个指向TessBaseAPI的实例。我们初始化英文(eng)并且选择tesseract::OEM_LSTM_ONLY(命令行操作对应的是 --oem 1)。最后我们使用OpenCV读取图片,对这个图片使用引擎的SetImage方法。输出的字符串使用GetUTFText()函数。
#include
#include
#include
#include
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
string outText;
string imPath = argv[1];
// Create Tesseract object
tesseract::TessBaseAPI *ocr = new tesseract::TessBaseAPI();
// Initialize tesseract to use English (eng) and the LSTM OCR engine.
ocr->Init(NULL, "eng", tesseract::OEM_LSTM_ONLY);
// Set Page segmentation mode to PSM_AUTO (3)
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 EXIT_SUCCESS;
}
你可以通过下面的命令行编译代码:
g++ -O3 -std=c++11 ocr_simple.cpp `pkg-config --cflags --libs tesseract opencv`-o ocr_simple
打印输出:
1
章程序员书库 es
IT后王汪局 扩玫1
管区册让全这
Learning OpenCV 3 Compnuter Vision with Python
ut
[爱尔兰] 乔. 米尼奇诺 ( Joe Minichino ) 3
了
刘波 苗贝贝 史斌 译
Output
Store #056663515
DEL MAR HTS,RD
SAN DIEGO, CA 92130
(858) 792-7040Register #4 Transaction #571140
Cashier #56661020 8/20/17 5:45PMwellnesst+ with Plenti
Plenti Card#: 31XXXXXXXXXX4553
1 G2 RETRACT BOLD BLK 2PK 1.99 T
SALE 1/1.99, Reg 1/4.69
Discount 2.70-
1 Items Subtotal 1.99
Tax .15
Total 2.14
*xMASTER* 2.14
MASTER card * #XXXXXXXXXXXX548S
Apo #AA APPROVAL AUTO
Ref # 05639E
Entry Method: Chip
Output
SKATEBOARDING
BICYCLE RIDING
ROLLER BLADING
SCOOTER RIDING
®
原文地址:https://www.learnopencv.com/deep-learning-based-text-recognition-ocr-using-tesseract-and-opencv/