Tesseract模型识别提取图像文字

一、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的跨平台开源软件包管理器,极大地简化了 WindowsLinux 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.traineddataNULL表示从默认的位置加载。当然也可以把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开发的示例工程。
  • 23
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值