Tesseract OCR识图工具,通过composer接入hyperf使用

时间:2024-07-05 07:02:19

本文主要使用编译安装,yum安装未深入研究为何无法使用

一、下载依赖

sudo yum install -y gcc gcc-c++ make autoconf automake libtool pkgconfig
sudo yum install -y leptonica leptonica-devel

这里额外记录一下我踩的坑,第二个依赖安装的时候出现了一些状况

[root@ip-172-31-37-111 tesseract-5.2.0]# yum install -y leptonica leptonica-devel
Last metadata expiration check: 12:22:32 ago on Wed Jun 26 22:37:31 2024.
Package wget-1.21.3-1.amzn2023.0.3.x86_64 is already installed.
Error: 
 Problem 1: conflicting requests
  - nothing provides libpng15.so.15()(64bit) needed by leptonica-1.72-2.el7.x86_64 from epel
  - nothing provides libpng15.so.15(PNG15_0)(64bit) needed by leptonica-1.72-2.el7.x86_64 from epel
  - nothing provides libgif.so.4()(64bit) needed by leptonica-1.72-2.el7.x86_64 from epel
  - nothing provides libwebp.so.4()(64bit) needed by leptonica-1.72-2.el7.x86_64 from epel
 Problem 2: package leptonica-devel-1.72-2.el7.x86_64 from epel requires leptonica(x86-64) = 1.72-2.el7, but none of the providers can be installed
  - package leptonica-devel-1.72-2.el7.x86_64 from epel requires liblept.so.4()(64bit), but none of the providers can be installed
  - conflicting requests
  - nothing provides libpng15.so.15()(64bit) needed by leptonica-1.72-2.el7.x86_64 from epel
  - nothing provides libpng15.so.15(PNG15_0)(64bit) needed by leptonica-1.72-2.el7.x86_64 from epel
  - nothing provides libgif.so.4()(64bit) needed by leptonica-1.72-2.el7.x86_64 from epel
  - nothing provides libwebp.so.4()(64bit) needed by leptonica-1.72-2.el7.x86_64 from epel
(try to add '--skip-broken' to skip uninstallable packages)

安装Leptonica依赖

没错,就是因为这里无法yum无法使用,我又一次选择了源码编译安装 ,需要注意的是,在使用ocr的时候需要Leptonica依赖版本超过1.74,所以可以先执行以下yum remove leptonica leptonica-devel删除依赖,如本机并无安装则忽略

wget https://github.com/DanBloomberg/leptonica/archive/refs/tags/1.82.0.tar.gz
tar -xzvf 1.82.0.tar.gz
cd leptonica-1.82.0

./autogen.sh
./configure
make
make install
ldconfig

安装成功后检验Leptonica是否安装成功

1.检查liblept共享库是否存在

// 检查 liblept 共享库是否存在
ldconfig -p | grep liblept
// 如果成功安装,你应该看到类似下面的输出
liblept.so.5 (libc6,x86-64) => /usr/local/lib/liblept.so.5
liblept.so (libc6,x86-64) => /usr/local/lib/liblept.so

2.使用 pkg-config 检查版本

pkg-config --modversion lept

// 成功则展示
1.82.0

如果成功这里会直接显示安装的 Leptonica 版本,反之失败,这里我是失败了的,是因为我的pkg-config无法找到依赖配置(如果成功了就跳过这一段)

2.2 pkg-config无法检测到依赖配置文件
步骤一:找到 lept.pc 文件

通常,lept.pc 文件会安装在 /usr/local/lib/pkgconfig/usr/lib/pkgconfig 目录下。首先检查这个文件是否存在:

// 一般都在第一个路径里面
find /usr/local/lib/pkgconfig -name "lept.pc"
find /usr/lib/pkgconfig -name "lept.pc"
步骤二:设置 PKG_CONFIG_PATH 环境变量

如果 lept.pc 文件存在,但 pkg-config 仍然找不到它,这里需要将其所在目录添加到 PKG_CONFIG_PATH 环境变量中

我的是位于 /usr/local/lib/pkgconfig 目录中,设置环境变量

export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig

最后再次检验版本pkg-config --modversion lept

为了持久性,我们需要将环境变量添加到shell 配置文件中

echo 'export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig' >> ~/.bashrc
source ~/.bashrc

二、安装TesseractOcr

# 下载 Tesseract 源代码
wget https://github.com/tesseract-ocr/tesseract/archive/refs/tags/5.2.0.tar.gz
tar -xzvf 5.2.0.tar.gz
cd tesseract-5.2.0

# 配置和编译
./autogen.sh
./configure
make
make install
ldconfig

如果不出意外可以一路安装成功,然后可以使用tesseract --version检查版本

你认为这个时候就可以了?那就大错特错了

我在tesseract --version,不出所料的失败了哈哈

[root@ip-172-31-37-111 tesseract-5.2.0]# tesseract --version
tesseract: error while loading shared libraries: libtesseract.so.5: cannot open shared object file: No such file or directory

发现是找不到 libtesseract.so.5 共享库,这通常是因为动态链接库路径未正确设置 

设置libtesseract.so.5 共享库

首先,查找 libtesseract.so.5 文件的实际位置:

find /usr/local/lib -name "libtesseract.so.5"
find /usr/lib -name "libtesseract.so.5"

如果找到 libtesseract.so.5,将其所在目录添加到 LD_LIBRARY_PATH 环境变量中。例如,如果它位于 /usr/local/lib

export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

将库路径添加到 ldconfig 配置文件中,使其在系统重启后仍然有效:

  1. 创建一个新的配置文件或编辑现有的配置文件,例如 /etc/ld.so.conf.d/tesseract.conf,并添加库路径:

    echo "/usr/local/lib" > /etc/ld.so.conf.d/tesseract.conf
  2. 更新库缓存

    ldconfig

再次查看tesseract版本

[root@ip-172-31-37-111 tesseract-5.2.0]# tesseract --version
tesseract 5.2.0
 leptonica-1.82.0
  libgif 5.2.1 : libjpeg 6b (libjpeg-turbo 2.1.4) : libpng 1.6.37 : libtiff 4.4.0 : zlib 1.2.11 : libwebp 1.2.4
 Found AVX512BW
 Found AVX512F
 Found AVX2
 Found AVX
 Found FMA
 Found SSE4.1
 Found OpenMP 201511
 Found libcurl/8.5.0 OpenSSL/3.0.8 zlib/1.2.11 libidn2/2.3.2 libpsl/0.21.1 (+libidn2/2.3.2) nghttp2/1.57.0

OK,安装成功!!!

测试TesseractOcr识别图片

[root@ip-172-31-37-111 ~]# tesseract photo_2024-06-27_14-18-25.jpg output
Error opening data file /usr/local/share/tessdata/eng.traineddata
Please make sure the TESSDATA_PREFIX environment variable is set to your "tessdata" directory.
Failed loading language 'eng'
Tesseract couldn't load any languages!
Could not initialize tesseract

失败……是因为我们没有语言训练数据文件,而TesseractOcr需要

1.安装语言文件

// 安装语言文件
wget https://github.com/tesseract-ocr/tessdata/raw/main/eng.traineddata
// 丢到数据文件
mkdir -p /usr/local/share/tessdata
mv eng.traineddata /usr/local/share/tessdata/

2.设置 TESSDATA_PREFIX 环境变量

export TESSDATA_PREFIX=/usr/local/share/tessdata/

确保每次启动 shell 时都能正确设置 TESSDATA_PREFIX,可以将其添加到你的 shell 配置文件中,例如 ~/.bashrc 或 ~/.bash_profile

echo 'export TESSDATA_PREFIX=/usr/local/share/' >> ~/.bashrc
source ~/.bashrc

3.其他语言数据

如果你需要其他语言的数据文件,可以从 Tesseract 官方 GitHub 仓库 下载相应的 .traineddata 文件并放入 tessdata 目录。

# 示例:下载中文简体语言数据文件
wget https://github.com/tesseract-ocr/tessdata/raw/main/chi_sim.traineddata
mv chi_sim.traineddata /usr/local/share/tessdata/
# 指定语言文件
tesseract photo_2024-06-27_14-18-25.jpg output -l chi_sim

4.测试使用

命令第二个参数是需要识别的图片,第三个参数是内容输出的文件名

tesseract photo_2024-06-27_14-18-25.jpg output

OK,成功。

三、 接入Hyperf

通过composer安装

composer require thiagoalessio/tesseract_ocr

不啰嗦,直接上示例文件 

<?php

namespace App\Controller;

use Hyperf\HttpServer\Annotation\Controller;
use Hyperf\HttpServer\Annotation\RequestMapping;
use thiagoalessio\TesseractOCR\TesseractOCR;

/**
 * @Controller
 */
class OcrController extends AbstractController
{
    /**
     * @RequestMapping(path="ocr", methods="get")
     */
    public function ocr()
    {
        $imagePath = '/path/to/your/image.jpg';
        
        try {
            $ocr = new TesseractOCR($imagePath);
            $ocr->lang('chi_sim'); // 设置语言为中文简体
            $text = $ocr->run();
        } catch (\Exception $e) {
            return [
                'error' => $e->getMessage(),
            ];
        }

        return [
            'text' => $text,
        ];
    }
}

如果需要base64的话也可以,上文件

<?php

namespace App\Controller;

use thiagoalessio\TesseractOCR\TesseractOCR;
use Hyperf\HttpServer\Annotation\AutoController;

#[AutoController]
class OcrImgController extends BaseController
{
    
    public function index()
    {
        $base64Image = $this->request->input('image');

        // 去掉base64头部,如 "data:image/jpeg;base64,"
        if (preg_match('/^data:image\/(\w+);base64,/', $base64Image, $type)) {
            $base64Image = substr($base64Image, strpos($base64Image, ',') + 1);
            $type = strtolower($type[1]); // jpg, png, gif
        } else {
            return ['error' => 'Invalid image data'];
        }

        // 解码Base64图片
        $imageData = base64_decode($base64Image);
        if ($imageData === false) {
            return ['error' => 'Base64 decode failed'];
        }

        // 创建临时文件
        $tempImagePath = tempnam(sys_get_temp_dir(), 'ocr_') . '.' . $type;
        if (file_put_contents($tempImagePath, $imageData) === false) {
            return ['error' => 'Failed to save image'];
        }

        try {
            // 使用Tesseract OCR识别文本
            $ocr = new TesseractOCR($tempImagePath);
            $ocr->lang('eng'); // 你可以根据需要设置语言
            $text = $ocr->run();
        } catch (\Exception $e) {
            unlink($tempImagePath); // 删除临时文件
            return ['error' => $e->getMessage()];
        }

        unlink($tempImagePath); // 删除临时文件

        return ['text' => $text];
    }
}

OK,分享结束

需要转载的同学,记得表明原文