Tesseract
Tesseract 是一个开源的光学字符识别(OCR)引擎,最初由 Hewlett-Packard(惠普)实验室开发,后来由 Google 收购并继续维护和开源贡献。Tesseract 可以识别多种语言的文字,广泛应用于将图片或扫描文档中的文本内容转换成可编辑的文本格式。随着深度学习技术的发展,Tesseract 也整合了基于深度神经网络的 OCR 模型,提升其识别准确率,特别是对于复杂排版和手写体的识别效果有所改善。
Tesseract 适合开发人员和研究人员使用,可以嵌入到各种应用中,比如文档数字化、图像处理软件、内容管理系统等。它支持命令行操作,也提供了丰富的 API 接口,支持 C++、Python、Java、Node.js 等多种编程语言,便于集成和调用。Tesseract 的核心功能包括文本检测、字符识别和后处理纠错,能够处理多种图像输入格式,输出包括纯文本、HOCR(HTML + OCR)格式、PDF 等多种格式。Tesseract 的高灵活性和强大的识别能力使其成为 OCR 领域中非常受欢迎的工具之一。
GitHub地址:https://github.com/tesseract-ocr/tesseract
Tesseract提供了丰富的 API 接口,支持 C++、Python、Java、Node.js 等多种编程语言,没有C#的,实际上已经有大佬做了C#的封装了,并提供了一个示例项目,需要只是简单使用一下,用这个大佬的就很方便了。
感兴趣的可以瞧瞧:
项目GitHub地址:https://github.com/charlesw/tesseract
示例GitHub地址:https://github.com/charlesw/tesseract-samples
但这不是我们今天的主题,现在还处于学习阶段,能直接使用大佬的库确实很方便,但是如果自己能够知道大佬是怎么实现的,那不是也很酷吗?
实现的方式与大佬项目的方式是类似的,如下所示:
需要依赖leptonica-1.82.0.dll与tesseract50.dll,然后通过DllImport导入其中的C++函数。
已经有现成的库了为什么不直接使用呢?
第一,项目中可能只需要用到Tesseract的几个C++ API而已,直接引用一大堆东西没有必要。第二,学习阶段,以自己学习掌握技能为主,自己先掌握了这项技能,然后偷懒了直接使用大佬的库也不迟。
Windows编译Tesseract
首先我们需要先在Windows上编译Tesseract,官方文档有一些介绍,文档地址:https://tesseract-ocr.github.io/tessdoc/Compiling.html。
查看文档之后,我使用这种方式:
先来简单介绍一下vcpkg。
vcpkg
vcpkg是一个用来管理C++库的跨平台包管理工具,由微软开发并维护,旨在帮助开发者简化第三方库的集成和使用过程。vcpkg通过提供预编译的二进制包和源代码,使开发者能够在Windows、Linux和macOS等操作系统上轻松安装和管理C++库。它支持多种编译器,包括Visual Studio、GCC和Clang。vcpkg的使用非常简单,只需要下载并安装,然后通过命令行工具指定要安装的库名,vcpkg会自动下载、编译并安装所需的库及其依赖项。此外,vcpkg还具有版本控制功能,能够方便地切换库的不同版本。它对于提升开发效率、保持项目的一致性以及解决跨平台开发中的库兼容性问题非常有帮助。许多开源项目和商业软件都选择使用vcpkg来管理和分发依赖库。
使用vcpkg安装Tesseract
git clone https://github.com/microsoft/vcpkg.git
cd vcpkg; .\bootstrap-vcpkg.bat
vcpkg install tesseract:x64-windows
安装完成:
vcpkg integrate install
为这个 vcpkg 根目录应用了全局用户集成。 CMake 项目应使用:“-DCMAKE_TOOLCHAIN_FILE=D:/Learning/vcpkg/scripts/buildsystems/vcpkg.cmake”
现在所有 MSBuild C++ 项目都可以 #include 任何已安装的库。链接将会自动处理。安装新库后,它们将立即可用。
vcpkg list
新建一个C++项目使用Tesseract C++ API
我写了两个简单的函数用于测试。
头文件:
#pragma once
extern "C" __declspec(dllexport) char* getChineseText(const char* imagePath);
extern "C" __declspec(dllexport) char* getEnglishText(const char* imagePath);
extern "C" __declspec(dllexport) void freeMemory(char* ptr);
源文件:
#include <tesseract/baseapi.h>
#include <leptonica/allheaders.h>
#include "test.h"
#include <iostream>
void windows_cmd_support_utf8(void)
{
system("chcp 65001 & cls"); //cls 用来清除 chcp 的输出
}
char* getEnglishText(const char* imgPath) {
tesseract::TessBaseAPI* api = new tesseract::TessBaseAPI();
if (api->Init(NULL, "eng")) {
fprintf(stderr, "Could not initialize tesseract.\n");
delete api;
return nullptr;
}
Pix* image = pixRead(imgPath);
if (!image) {
fprintf(stderr, "Could not read image file.\n");
api->End();
delete api;
return nullptr;
}
api->SetImage(image);
char* outText = api->GetUTF8Text();
if (!outText) {
fprintf(stderr, "OCR failed.\n");
api->End();
pixDestroy(&image);
delete api;
return nullptr;
}
api->Clear();
api->End();
delete api;
pixDestroy(&image);
return outText;
}
char* getChineseText(const char* imgPath) {
tesseract::TessBaseAPI* api = new tesseract::TessBaseAPI();
if (api->Init(NULL, "chi_sim")) {
fprintf(stderr, "Could not initialize tesseract.\n");
delete api;
return nullptr;
}
Pix* image = pixRead(imgPath);
if (!image) {
fprintf(stderr, "Could not read image file.\n");
api->End();
delete api;
return nullptr;
}
api->SetImage(image);
char* outText = api->GetUTF8Text();
if (!outText) {
fprintf(stderr, "OCR failed.\n");
api->End();
pixDestroy(&image);
delete api;
return nullptr;
}
api->Clear();
api->End();
delete api;
pixDestroy(&image);
return outText;
}
void freeMemory(char* ptr) {
delete[] ptr;
}
int main()
{
const char* imgPath = "D:\\SemanticKernel-Test2.png"; // 替换为你的图像文件路径
const char* imgPath2 = "D:\\test666.png"; // 替换为你的图像文件路径
// 第一次调用
char* result1 = getChineseText(imgPath);
windows_cmd_support_utf8();
std::cout << "OCR Result 1: " << result1 << std::endl;
// 第二次调用
char* result2 = getChineseText(imgPath2);
std::cout << "OCR Result 2: " << result2 << std::endl;
// 释放内存
//freeMemory(result1);
//freeMemory(result2);
return 0; // 程序正常结束
}
注意
标签:api,C#,C++,char,API,vcpkg,Tesseract From: https://blog.csdn.net/mingupup/article/details/144776558