Centos7安装Tesseract5.5.0+SpringBoot集成部署(离线版)
目录
前言
环境安装
Windows安装
Linux安装
1、安装包准备
2、设置编译环境
升级 GCC 到 12.2.0
a、查看和安装gcc-12.2.0需要的依赖
b、安装gmp、mpfr、mpc、isl
c、安装
3、安装依赖库
4、安装Leptonica库(root)
5、安装Tesseract-OCR(root)
SpringBoot 集成部署
1、项目引入依赖和实现
1)、pom依赖
2)、业务类实现
2、Windows验证
3、Linux部署验证
参考文献
前言
Java 中实现 OCR(光学字符识别)功能,可以使用 Tesseract OCR,这是一个开源的 OCR 引擎,支持多种语言,并且可以在 Java 中通过 Tesseract API 进行集成。
官网GitHub : Releases · tesseract-ocr/tesseract · GitHub
环境安装
Windows安装
Windows版本本地安装过程中,记得勾选中文语言包
一路next 后,安装成功,进入安装目录, 输入命令
tesseract --list-langs
查看支持的语言
其他语言参考:tesseract语言库
Linux安装
Tesseract必须使用Leptonica库来打开输入图像,所以需要下载,安装,使用内置支持zlib、png和tiff(用于多页tiff)的leptonica。
1、安装包准备
Tesseract OCR 和 Leptonica 是两个紧密相关的开源项目。Tesseract 依赖于 Leptonica 进行图像处理,因此它们的版本需要兼容。以下是 Tesseract 和 Leptonica 的版本对应关系,以及如何选择合适的版本:
对应版本内容可以查看 Tesseract官方GitHub 查看,
这里使用 Tesseract 5.5.0 和 Leptonica 1.83.1 版本
进入服务器,创建software文件夹
# mkdir /usr/local/software
# cd /usr/local/software
到官网地址
Tesseract官方GitHub
Leptonica官方GitHub
下载后上传依赖包,有梯子的可以直接使用 wget 命令下载
# wget https://github.com/tesseract-ocr/tesseract/archive/refs/tags/5.5.0.tar.gz
# wget https://github.com/DanBloomberg/leptonica/releases/download/1.83.1/leptonica-1.83.1.tar.gz
解压压缩包
# tar -zxvf tesseract-5.5.0.tar.gz
# tar -zxvf leptonica-1.83.1.tar.gz
2、设置编译环境
首先,确保您的Linux系统已经安装了必要的编译工具:
# yum install gcc gcc-c++ make
执行命令时报错:
解决方式可参考:“Could not resolve host: mirrorlist.centos.org; 未知的错误”
解决后,需要把 CentOS-Base.repo 设置个别名,不然依旧会优先引用
# mv CentOS-Base.repo CentOS-Base.repo.backup
# ll
处理后,再重新执行命令
# yum install gcc gcc-c++ make
升级 GCC 到 12.2.0
因为Tesseract对gcc有版本要求
查看当前版本
# gcc --version
Tesseract 5.5.0 使用 GCC 4.8.5 版本验证过了,失败!需要升级更高版本。
centos 7默认安装的版本为 gcc 4.8.5,本环境将升级至 12.2.0 (当前查询到最新版本是14.2.0 ,但安装过程中一直有各类错误,查阅现有能找到的资料,仅升级到12.2.0)
下载地址:GCC版本包
下载包后上传到服务器,并解压
# cd /usr/local/software
# tar -zxvf gcc-12.2.0.tar.gz
查看和安装 gcc-12.2.0 需要的依赖
a、查看和安装gcc-12.2.0需要的依赖
查看 gcc-12.2.0 所需依赖库
不同版本的gcc所需依赖库不同,可在源码文件 contrib/download_prerequisites 中查看。
# cd gcc-12.2.0
# vim contrib/download_prerequisites
(下图仅对比 14.2.0 依赖差异,可跳过)下面这个图是给出 gcc-14.2.0 的安装包做对比,多出了gettext 依赖包,但下载的包有各类缺失导致不成功,有兴趣的可以自行研究下。
所需依赖各下载包版本地址:
gmp 版本包
mpfr 版本包
mpc 版本包
isl 版本包
gettext 版本包
b、安装gmp、mpfr、mpc、isl
将gmp、mpfr、mpc、isl 压缩包放置解压后的 gcc-12.2.0 目录。
在源码目录下运行 ./contrib/download_prerequisites 文件,脚本会解压gmp、mpfr、mpc、isl 的压缩包并创建文件夹软链接。
# ./contrib/download_prerequisites
查看软连接 # ll
创建一个build目录作为构建目录,进入目录进行编译
# mkdir build && cd build
# ../configure --enable-checking=release --enable-languages=c,c++ -disable-multilib
c、安装
# make
好久。。。好久。。。
# make install
重启下服务器,在进行版本检查
# g++ -v && gcc -v
升级成功
3、安装依赖库
接下来,安装Tesseract和Leptonica所需的其他依赖库:
# yum install autoconf automake libtool -y
# yum install libjpeg-devel libpng-devel libtiff-devel zlib-devel -y
4、安装Leptonica库(root)
Leptonica是Tesseract的一个依赖库。以下是安装步骤:
进入解压好的Leptonica目录进行编译安装
# cd /usr/local/software/leptonica-1.83.1/
# ./autogen.sh
# ./configure
# make && make install
执行成功, 添加 leptonica环境变量,修改profile
# vim /etc/profile
# 添加信息 i
export LD_LIBRARY_PATH=/usr/local/lib
export LIBLEPT_HEADERSDIR=/usr/local/include
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
保存,刷新配置
# source /etc/profile
5、安装Tesseract-OCR(root)
进入目录,依次执行以下命令,进行程序编译,安装
# cd /usr/local/software/tesseract-5.5.0/
# ./autogen.shll #会生成 configure文件
# ./configure
# make && make install
添加到环境变量
# vim /etc/profile
PATH=$PATH:/usr/local/tesseract/bin
export PATH
export TESSDATA_PREFIX=/usr/local/share/tessdata
export PATH=$PATH:$TESSDATA_PREFIX
保存,刷新配置
# source /etc/profile
查看tesseract版本
tesseract –version
此时就可以看到 tesseract 的依赖包有哪些
把so动态链接库复制 lib64 库中
# cp /usr/local/lib/*.so.* /usr/lib64/
查看可执行文件路径:
# which tesseract
当前语言包的路径(如果你下载了语言包,丢到这里):
# cd /usr/local/share/tessdata
tesseract语言库
语言包下载地址
这里下载常用的简体中文和英文即可
上传后,检测支持语言
# tesseract --list-langs
上传一张图片 到 test 目录 ,验证下
识别名为bingli.jpg的图片中的文字,并将结果保存到output.txt文件中
# cd /usr/local/software/tesseract-5.5.0/test/
# tesseract bingli.jpg output -l chi_sim
查看识别内容
# cat output.txt
SpringBoot 集成部署
1、项目引入依赖和实现
1)、pom依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>tesseract-ocr</artifactId>
<version>1.0</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.8.RELEASE</version>
</parent>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>5.8.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<skip>true</skip>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
2)、业务类实现
OCRService实现类
package com.tesseract.ocr.service;
import com.tesseract.ocr.example.OCRExample;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.awt.*;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@Service
public class OCRService {
public static Logger logger = LoggerFactory.getLogger(OCRExample.class);
/**
* 全文识别
*
* @param file
* @throws TesseractException
*/
public void testAllText(MultipartFile file) throws TesseractException, IOException {
// 创建 Tesseract OCR 实例
Tesseract tess = getBaseTesseract();
File imageFile = convertMultipartFileToFile(file);
String result = tess.doOCR(imageFile);
// 输出 OCR 识别结果
System.out.println("======================================");
System.out.println("OCR 识别结果:");
System.out.println(result);
}
/**
* 指定多个区域识别
*
* @param file
* @throws TesseractException
*/
public void testAssignArea(MultipartFile file) throws TesseractException, IOException {
// 创建 Tesseract OCR 实例
Tesseract tess = getBaseTesseract();
File imageFile = convertMultipartFileToFile(file);
// 获取图片的 OCR 结果
List<Rectangle> regions = new ArrayList<>();
// 病历
regions.add(new Rectangle(380, 750, 400, 150));
regions.add(new Rectangle(2215, 895, 505, 120));
regions.add(new Rectangle(190, 1300, 1200, 600));
// 执行 OCR 操作
for (int i = 0; i < regions.size(); i++) {
Rectangle regionTemp = regions.get(i);
String resultTemp = tess.doOCR(imageFile, regionTemp); // 对单个区域进行 OCR
System.out.println("======================================");
System.out.println("区域 " + (i + 1) + " 的识别结果:");
System.out.println(resultTemp);
System.out.println("-----------------------------");
}
}
/**
* 转化为File
*
* @param multipartFile
* @return
* @throws IOException
*/
public static File convertMultipartFileToFile(MultipartFile multipartFile) throws IOException {
// 获取上传文件的原始文件名
String originalFilename = multipartFile.getOriginalFilename();
// 提取文件后缀名
String fileExtension = "";
if (originalFilename != null && originalFilename.contains(".")) {
fileExtension = originalFilename.substring(originalFilename.lastIndexOf("."));
}
// 创建一个临时文件
File file = File.createTempFile("temp", fileExtension);
// 将 MultipartFile 转换为 File
multipartFile.transferTo(file);
// 设置 JVM 退出时删除临时文件
file.deleteOnExit();
// 返回 File 对象
return file;
}
/**
* 获取基础Tesseract配置
*
* @return Tesseract
*/
private Tesseract getBaseTesseract() {
// 创建 Tesseract OCR 实例
Tesseract tess = new Tesseract();
// 设置 Tesseract 的路径(指向你安装 Tesseract 的路径)
// 你需要将此路径指向 Tesseract 安装文件夹下的 tessdata 目录
// windows
tess.setDatapath("F:\\tesseract-ocr\\software\\tessdata");
// linux
// tess.setDatapath("/usr/local/share/tessdata");
// 设置 OCR 识别的语言,如果是英文,可以使用 "eng",中文,可以使用 "chi_sim", eng+chi_sim同时使用英文和中文
tess.setLanguage("chi_sim+eng"); // chi_sim+eng同时使用英文和中文,放在前面的语言为主要识别语言
return tess;
}
}
OCRController控制层
package com.tesseract.ocr.controller;
import com.tesseract.ocr.service.OCRService;
import net.sourceforge.tess4j.TesseractException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
@RestController
@RequestMapping("/ocr")
@Validated
public class OCRController {
@Autowired
private OCRService ocrService;
/**
* 全区域识别
*
* @param file
* @throws IOException
* @throws TesseractException
*/
@PostMapping("/testAll")
public void testAll(@RequestParam("image") MultipartFile file) throws IOException, TesseractException {
ocrService.testAllText(file);
}
/**
* 指定区域识别
*
* @param file
* @throws IOException
* @throws TesseractException
*/
@PostMapping("/testArea")
public void testArea(@RequestParam("image") MultipartFile file) throws IOException, TesseractException {
ocrService.testAssignArea(file);
}
}
2、Windows验证
使用postman 验证,控制台打印
全区域识别 接口调用控制台打印结果
指定多个区域 接口调用控制台打印结果
3、Linux部署验证
打成JAR推送Linux Centos7 服务器
优先确保服务器搭建了JAVA环境,没有可参考:linux-Centos-7-64位:1、 安装JAVA环境
进入服务器放测试图片的 test 目录,将jar上传到该测试目录下
# cd /usr/local/software/tesseract-5.5.0/test
启动 Jar
# java -jar tesseract-ocr-1.0.jar
使用命令调用接口
# curl -X POST -F "image=@bingli.jpg" http://localhost:8818/api/v1/ocr/test
查看控制台打印结果
部署验证完成,对于识别的准确性,需要后续自行训练验证。
PS:不是最新的版本就是最好的,要注意所需版本依赖搭配,一开始都用最新的没少踩坑!
参考文献
Linux 安装 Tesseract 4.1.0
Linux安装tesseract 5.2.0教程
linux离线升级gcc版本---gcc4.8.5-->gcc12.2.0
centors7升级GLIBC2.18