一、OCR
OCR,即Optical Character Recognition,光学字符识别,是指通过扫描字符,然后通过其形状将其翻译成电子文本的过程。
二、Tesseract
目前最流行的开源OCR软件就是*Tesseract
*。
Tesseract
是一款由HP实验室开发由Google维护的开源OCR(Optical Character Recognition , 光学字符识别)引擎,与Microsoft Office Document Imaging(MODI
)相比,我们可以不断的训练的库,使图像转换文本的能力不断增强;如果团队深度需要,还可以以它为模板,开发出符合自身需求的OCR引擎。
Tesseract-ocr
Github
地址如下:
https://github.com/tesseract-ocr/tesseract
三、Windows编译安装Tesseract
1、准备工作
科学上网,否则一些文件下载不了(要从github
下载依赖文件)。
2、安装vcpkg
**vcpkg
**是Microsoft
的跨平台开源软件包管理器,极大地简化了 Windows
、Linux
和 macOS
上第三方库的购置与安装。如果项目要使用第三方库,建议通过 vcpkg
来安装它们。vcpkg
同时支持开源和专有库。
① 获取vcpkg源码
Vcpkg的官方源码站点为:microsoft/vcpkg: C++ Library Manager for Windows, Linux, and MacOS (github.com)
git clone https://github.com/microsoft/vcpkg
② 编译vcpkg源码
Windows
平台:在cmd
中执行Vcpkg
工程目录下的“bootstrap-vcpkg.bat”
命令,编译好后会在同级目录下生成vcpkg.exe
文件。
Linux
平台:在命令行中执行在vcpkg
工程目录下“sudo bash ./ bootstrap-vcpkg.sh”
命令,会生成一个可执行文件vcpkg
。定义环境变量 VCPKG_ROOT="/vcpkg"
③ 添加到path环境变量
将 vcpkg.exe
路径添加到系统path环境变量中,将该源码目录添加至windows的系统用户的path环境变量中。
④ 安装示例
Windows
安装示例如下:
3、编译安装Tesseract库
① 下载Tesseract源码
从 github
获取 tesseract
源码:
git clone https://github.com/tesseract-ocr/tesseract
② 编译Tesseract源码
命令行切换至 tesseract 源码目录下,执行如下命令:
- 编译生成静态库api命令
vcpkg install tesseract:x64-windows-static
- 编译生成动态库api命令
vcpkg install tesseract:x64-windows
然后等它全部下载、配置、编译完成即可。完成后,命令行类似这样:
- 执行过程:
Microsoft Windows [版本 10.0.20348.169]
(c) Microsoft Corporation。保留所有权利。
C:\Users\Administrator\Desktop\git\tesseract-5.3.4>
C:\Users\Administrator\Desktop\git\tesseract-5.3.4>vcpkg install tesseract:x64-windows
Computing installation plan...
The following packages will be built and installed:
* bzip2[core,tool]:x64-windows@1.0.8#5
* curl[core,non-http,schannel,ssl,sspi]:x64-windows@8.6.0
* giflib:x64-windows@5.2.2
* leptonica:x64-windows@1.84.1
* libarchive[bzip2,core,crypto,libxml2,lz4,lzma,zstd]:x64-windows@3.7.2
* libiconv:x64-windows@1.17#2
* libjpeg-turbo:x64-windows@3.0.2
* liblzma:x64-windows@5.4.4
* libpng:x64-windows@1.6.43
* libwebp[core,libwebpmux,nearlossless,simd,unicode]:x64-windows@1.3.2
* libxml2[core,iconv,lzma,zlib]:x64-windows@2.11.7
* lz4:x64-windows@1.9.4#1
* openjpeg:x64-windows@2.5.2
* openssl:x64-windows@3.2.1
tesseract:x64-windows@5.3.4
* tiff[core,jpeg,lzma,zip]:x64-windows@4.6.0#4
* vcpkg-cmake:x64-windows@2023-05-04
* vcpkg-cmake-config:x64-windows@2022-02-06#1
* vcpkg-cmake-get-vars:x64-windows@2023-12-31
* zlib:x64-windows@1.3.1
* zstd:x64-windows@1.5.5#2
Additional packages (*) will be modified to complete this operation.
Detecting compiler hash for triplet x64-windows...
A suitable version of powershell-core was not found (required v7.2.16) Downloading portable powershell-core 7.2.16...
- 执行完成:
-- Installing: C:/Tools/vcpkg-master/packages/tesseract_x64-windows/include/tesseract/textord/underlin.h
-- Installing: C:/Tools/vcpkg-master/packages/tesseract_x64-windows/include/tesseract/textord/wordseg.h
-- Installing: C:/Tools/vcpkg-master/packages/tesseract_x64-windows/include/tesseract/textord/workingpartset.h
-- Installing: C:/Tools/vcpkg-master/packages/tesseract_x64-windows/include/tesseract/viewer/scrollview.h
-- Installing: C:/Tools/vcpkg-master/packages/tesseract_x64-windows/include/tesseract/viewer/svmnode.h
-- Installing: C:/Tools/vcpkg-master/packages/tesseract_x64-windows/include/tesseract/viewer/svutil.h
-- Installing: C:/Tools/vcpkg-master/packages/tesseract_x64-windows/include/tesseract/wordrec/associate.h
-- Installing: C:/Tools/vcpkg-master/packages/tesseract_x64-windows/include/tesseract/wordrec/chop.h
-- Installing: C:/Tools/vcpkg-master/packages/tesseract_x64-windows/include/tesseract/wordrec/drawfx.h
-- Installing: C:/Tools/vcpkg-master/packages/tesseract_x64-windows/include/tesseract/wordrec/findseam.h
-- Installing: C:/Tools/vcpkg-master/packages/tesseract_x64-windows/include/tesseract/wordrec/language_model.h
-- Installing: C:/Tools/vcpkg-master/packages/tesseract_x64-windows/include/tesseract/wordrec/lm_consistency.h
-- Installing: C:/Tools/vcpkg-master/packages/tesseract_x64-windows/include/tesseract/wordrec/lm_pain_points.h
-- Installing: C:/Tools/vcpkg-master/packages/tesseract_x64-windows/include/tesseract/wordrec/lm_state.h
-- Installing: C:/Tools/vcpkg-master/packages/tesseract_x64-windows/include/tesseract/wordrec/outlines.h
-- Installing: C:/Tools/vcpkg-master/packages/tesseract_x64-windows/include/tesseract/wordrec/params_model.h
-- Installing: C:/Tools/vcpkg-master/packages/tesseract_x64-windows/include/tesseract/wordrec/plotedges.h
-- Installing: C:/Tools/vcpkg-master/packages/tesseract_x64-windows/include/tesseract/wordrec/render.h
-- Installing: C:/Tools/vcpkg-master/packages/tesseract_x64-windows/include/tesseract/wordrec/wordrec.h
-- Installing: C:/Tools/vcpkg-master/packages/tesseract_x64-windows/share/tesseract/copyright
-- Performing post-build validation
Stored binaries in 1 destinations in 4.1 s.
Elapsed time to handle tesseract:x64-windows: 4.8 min
tesseract:x64-windows package ABI: c9307decc3a8bae2742548c76ecf4934095ecc5aab5b7eeaf4ec1117b5dd9e39
Total install time: 46 min
tesseract provides CMake targets:
# this is heuristically generated, and may not be correct
find_package(Tesseract CONFIG REQUIRED)
target_link_libraries(main PRIVATE Tesseract::libtesseract)
tesseract provides pkg-config modules:
# An OCR Engine that was developed at HP Labs between 1985 and 1995... and now at Google.
tesseract
C:\Users\Administrator\Desktop\git\tesseract-5.3.4>
注意:
编译完生成的 tesseract
库文件在 **vcpkg.exe
**所在目录下的 buildtrees\tesseract
下。
leptonica
的库文件则在 buildtrees/leptonica
目录下:
所有与 tesseract
相关的(被依赖的)库都在 vcpkg.exe
所在目录下的 buildtrees
目录下!!!
③ 整理部署
将相关include、dll、lib等文件整理到指定目录下,以便其他C++工程调用 tesseract
库。
- 创建 Tesseract 目录,在 Tesseract目录下分别创建 bin 、lib、dll、include和tessdata目录。
- 整理bin目录,将
C:\Tools\vcpkg-master\buildtrees
下搜索"*.exe"
,并把搜索到的 exe 拷贝到 bin目录下。
整理后的 bin 内容:
-
整理dll目录,将
C:\Tools\vcpkg-master\buildtrees
下搜索"*.dll"
,并把搜索到的 dll 拷贝到 dll目录下。
-
整理include目录,将
C:\Tools\vcpkg-master\buildtrees\libtonica
下搜索"*.h"
,并把搜索到的 头文件 拷贝到include/leptonica
目录下。 -
将
C:\Tools\vcpkg-master\buildtrees\tesseract\src\5.3.4-c52d77cd87.clean\include\tesseract
目录拷贝到 include下。
- 整理lib目录,将
*.lib
文件拷贝到 lib目录下。
4、训练库Tessdata
识别不同的文字,需要不同文字的训练库,用户可以通过 github
获取训练库,github地址如下:
https://github.com/tesseract-ocr/tessdata
① 获取训练库
下载 tessdata-main.zip
包。
② 部署训练库
将tessdata-main.zip
解压,并放到 C:\Tesseract\tessdata
目录下。
5、官方示例解读
官方示例如下:
#include <tesseract/baseapi.h>
#include <leptonica/allheaders.h>
int main()
{
char *outText;
tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI();
// Initialize tesseract-ocr with English, without specifying tessdata path
if (api->Init(NULL, "eng")) {
fprintf(stderr, "Could not initialize tesseract.\n");
exit(1);
}
// Open input image with leptonica library
Pix *image = pixRead("phototest.png");
api->SetImage(image);
// Get OCR result
outText = api->GetUTF8Text();
printf("OCR output:\n%s", outText);
// Destroy used object and release memory
api->End();
delete api;
delete [] outText;
pixDestroy(&image);
return 0;
}
api->Init(NULL, “eng”)
这句是加载eng.traineddata
,NULL
表示从默认的位置加载。当然也可以把eng.traineddata
的位置传进来。- 如果我们还想同时加载其他的语言的训练数据可以这样写:
api->Init(NULL, “eng+deu”)
这样就同时加载了 英文和 德文数据。 api->Init(NULL, “xxx”)
函数在程序中可以多次调用。每次调用后 OCR 引擎就被重新初始化。api->SetImage(image);
这就是加载图像。之后我们还可以限制只对图像的一部分区域进行 OCR。类似下面这条语句:
api->SetRectangle(left, top, width, height) ;
api->GetUTF8Text()
获得 OCR 识别出的字符串。需要特别注意的是GetUTF8Text()
返回的是 C 字符串,需要我们自己释放这个字符串的内存空间:
delete [] outText;
- 从这里也可以看出 Tesseract 比较原始,好歹应该返回个
std::string
啊。这样很容易造成内存泄漏。
一般在 OCR 之后还会看看识别的 confidence value
。
api->MeanTextConf();
这个值介于 0 到100 之间,越大说明识别正确的概率越大。
完事之后可以调用 api->End();
来释放内存空间。
6、案例解读
① 示例代码
代码功能为从摄像头实时获取视频流,然后识别文字信息,识别后的文字信息打印到控制台日志。
#include <string>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <windows.h>
#include <leptonica/allheaders.h>
#include <tesseract/baseapi.h>
#include "opencv2/opencv.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/core/core_c.h"
#include "opencv2/imgproc/types_c.h"
#include "opencv2/imgproc/imgproc_c.h"
using namespace std;
//UTF-8到GB2312的转换
char* U2G(const char* utf8)
{
int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
wchar_t* wstr = new wchar_t[len + 1];
memset(wstr, 0, len + 1);
MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);
len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
char* str = new char[len + 1];
memset(str, 0, len + 1);
WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL);
if (wstr) delete[] wstr;
return str;
}
//GB2312到UTF-8的转换
char* G2U(const char* gb2312)
{
int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);
wchar_t* wstr = new wchar_t[len + 1];
memset(wstr, 0, len + 1);
MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wstr, len);
len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
char* str = new char[len + 1];
memset(str, 0, len + 1);
WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);
if (wstr) delete[] wstr;
return str;
}
int main()
{
Pix* image = nullptr;
char* outText = nullptr;
tesseract::TessBaseAPI* api = new tesseract::TessBaseAPI();
/*
* 第一个参数指定“eng.traineddata”文件位置
*
* 第二个参数为语种,eng英语,chi_sim简体中文
*
* */
if (api->Init("C:\\Tesseract\\tessdata","eng"))
{
fprintf(stderr, "Could not initialize tesseract.\n");
delete api;
exit(1);
}
cv::namedWindow("Camera", cv::WINDOW_AUTOSIZE);
//打开摄像头
cv::VideoCapture cap;
bool openF = cap.open(0);
if (openF)
{
DWORD dwTime = GetTickCount();
for (;;)
{
cv::Mat frame;
cap >> frame;
if (frame.empty())
{
cv::waitKey(100);
continue;
}
//图形镜面处理
flip(frame, frame, -1); //xy轴翻转
flip(frame, frame, 1); //y轴翻转
flip(frame, frame, 0); //x轴翻转
//显示到Camera窗口
imwrite("frame.png", frame);
cv::imshow("Camera", frame);
DWORD dwAbsSec = GetTickCount();
if (GetTickCount() - dwTime > 1000)
{
dwTime = GetTickCount();
Pix* image = pixRead("frame.png");
api->SetImage(image);
outText = api->GetUTF8Text();
cout << U2G(outText) << endl;
}
cv::waitKey(10);
}
}
api->End();
pixDestroy(&image);
delete api;
delete outText;
return 0;
}
② 运行效果
7、资源说明
- **Tesseract.zip:**C++开发API,包含头文件和库文件;
- tessdata-main.zip: 训练库,含中英文多个国家的文字训练库;
- Demo.zip: 用vs2019开发的示例工程。