本文主要使用编译安装,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
配置文件中,使其在系统重启后仍然有效:
-
创建一个新的配置文件或编辑现有的配置文件,例如
/etc/ld.so.conf.d/tesseract.conf
,并添加库路径:echo "/usr/local/lib" > /etc/ld.so.conf.d/tesseract.conf
-
更新库缓存
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,分享结束
需要转载的同学,记得表明原文