首页 > 编程语言 >C#使用Tesseract C++ API过程记录

C#使用Tesseract C++ API过程记录

时间:2024-12-27 19:57:47浏览次数:7  
标签:api C# C++ char API vcpkg Tesseract

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

image-20241227152937200

Tesseract提供了丰富的 API 接口,支持 C++、Python、Java、Node.js 等多种编程语言,没有C#的,实际上已经有大佬做了C#的封装了,并提供了一个示例项目,需要只是简单使用一下,用这个大佬的就很方便了。

感兴趣的可以瞧瞧:

项目GitHub地址:https://github.com/charlesw/tesseract

image-20241227153302569

示例GitHub地址:https://github.com/charlesw/tesseract-samples

image-20241227153437445

但这不是我们今天的主题,现在还处于学习阶段,能直接使用大佬的库确实很方便,但是如果自己能够知道大佬是怎么实现的,那不是也很酷吗?

实现的方式与大佬项目的方式是类似的,如下所示:

image-20241227153822517

需要依赖leptonica-1.82.0.dll与tesseract50.dll,然后通过DllImport导入其中的C++函数。

已经有现成的库了为什么不直接使用呢?

第一,项目中可能只需要用到Tesseract的几个C++ API而已,直接引用一大堆东西没有必要。第二,学习阶段,以自己学习掌握技能为主,自己先掌握了这项技能,然后偷懒了直接使用大佬的库也不迟。

Windows编译Tesseract

首先我们需要先在Windows上编译Tesseract,官方文档有一些介绍,文档地址:https://tesseract-ocr.github.io/tessdoc/Compiling.html。

查看文档之后,我使用这种方式:

image-20241227154722530

先来简单介绍一下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

安装完成:

image-20241226105928367

vcpkg integrate install

image-20241226110526085

为这个 vcpkg 根目录应用了全局用户集成。 CMake 项目应使用:“-DCMAKE_TOOLCHAIN_FILE=D:/Learning/vcpkg/scripts/buildsystems/vcpkg.cmake”

现在所有 MSBuild C++ 项目都可以 #include 任何已安装的库。链接将会自动处理。安装新库后,它们将立即可用。

vcpkg list

image-20241226110859781

新建一个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

相关文章

  • 在FreeBSD或Ubuntu平台仿真RISCV64位版本FreeBSD系统相关技术文档
    本文档主要是针对没有实体机,用FreeBSD或Ubuntu平台仿真FreeBSDRISCV64系统的技术实现。RISCV64介绍RISCV64是一种基于RISC-V(以后简称RISCV)指令集架构(ISA)的64位处理器设计。RISCV是一种开放的指令集架构,由加州大学伯克利分校的研究团队于2010年首次发布,其设计目标是提供一个......
  • Centos7下yum安装报错问题解决方法Cannot find a valid baseurl for repo: base/7/x86
    Cannotfindavalidbaseurlforrepo:base/7/x86_64 目录Cannotfindavalidbaseurlforrepo:base/7/x86_64 原因如下:1.网络问题2.错误的YUM源配置3.代理设置问题 原因如下:1.网络问题首先,检查系统的网络连接是否正常,可以通过以下命令测试:ping......
  • 敏捷开发Scrum的深入理解和实践
            敏捷开发,特别是Scrum方法,已经逐渐成为软件开发领域的主流方法。Scrum不仅适用于软件开发,还适用于其他需要快速响应变化和灵活交付的领域。本文将深入探讨Scrum的核心概念、流程、优势、挑战及其在实践中的应用。 一、Scrum的核心概念        Scru......
  • C#使用Tesseract C++ API过程记录
    TesseractTesseract是一个开源的光学字符识别(OCR)引擎,最初由Hewlett-Packard(惠普)实验室开发,后来由Google收购并继续维护和开源贡献。Tesseract可以识别多种语言的文字,广泛应用于将图片或扫描文档中的文本内容转换成可编辑的文本格式。随着深度学习技术的发展,Tesseract也整合......
  • C#调用C++代码,以OpenCV为例
    前言使用C#调用C++代码是一个很常见的需求,因此本文以知名的C++机器视觉库OpenCV为例,说明在C#中如何通过使用P/Invoke(平台调用)来调用C++代码。只是以OpenCV为例,实际上在C#中使用OpenCV可以使用OpenCVSharp这个项目,这是一个很优秀的项目,GitHub地址:https://github.com/shimat/opencv......
  • [BUUCTF]disk
    [BUUCTF]disk分析VMDK:(VMWareVirtualMachineDiskFormat)是虚拟机VMware创建的虚拟硬盘格式,文件存在于VMware文件系统中,被称为VMFS(虚拟机文件系统)解题凡是先打开010获得ctf{unseCure_quick_form4t_vo1umer查找另外一半用7Z打开该vmdk文件,发现fatFAT文件系统是微软在上......
  • 【后期剪辑师必备技能】 Github上的神级软件 Ultimate Vocal Remover GUI v5.6 最便捷
    ......
  • Claude订阅使用教程:2025年国内如何充值购买Claude
    ​  Claude是一款功能强大的AI对话模型,其最新版本ClaudeSonnet3.5在处理复杂指令、理解上下文以及生成自然文本方面表现尤为出色。许多人认为ClaudePro是ChatGPTPlus的最佳替代品,甚至在某些场景下表现更优。以下将为你详细介绍如何快速订阅ClaudePro会员,包括准备......
  • 使用Stripe API加载数据到LangChain进行向量化处理
    老铁们,今天我们来探讨一下如何通过StripeAPI加载数据到LangChain中进行向量化处理。这波操作可以说是相当丝滑,特别是对于需要处理支付数据的项目来说,简直就是福音。##技术背景介绍Stripe是一个爱尔兰-美国的金融服务和SaaS公司,提供支付处理的软件和API接口,广泛应用于......
  • leetcode 870. 优势洗牌
    870.优势洗牌没做出啊......