当前位置: 首页 > news >正文

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.0Leptonica 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

相关文章:

  • 初识计算机网络
  • 企语企业管理系iFair(F23.2_a0)在Debian操作系统中的安装
  • 在Mac M1上面安装Miniconda
  • 【AI】在Ubuntu中使用docker对DeepSeek的部署与使用
  • 【Android开发】安卓手机APP拍照并使用机器学习进行OCR文字识别(完整工程资料源码)
  • Python 识别图片和扫描PDF中的文字
  • Elasticsearch+Logstash+Kibana可视化集群部署
  • 将Mac上Python程序的虚拟环境搬到Windows
  • 简述mysql 主从复制原理及其工作过程,配置一主两从并验证
  • 学习threejs,使用HemisphereLight半球光
  • 【DuodooBMS】给PDF附件加“受控”水印的完整Python实现
  • Java内存模型,内存屏障是干嘛的?
  • 2024年认证杯SPSSPRO杯数学建模A题(第二阶段)保暖纤维的保暖能力全过程文档及程序
  • 在nodejs中使用RabbitMQ(三)Routing、Topics、Headers
  • RocketMQ、RabbitMQ、Kafka 的底层实现、功能异同、应用场景及技术选型分析
  • Ubuntu 如何安装Snipaste截图软件
  • vue渲染函数用法示例
  • 【docker知识】快速找出服务器中占用内存较高的容器
  • 机试题——移动01字符串
  • Ubuntu20.04上搭建nginx正向代理提供上网服务
  • 夜读丨喜马拉雅山的背夫
  • 数说母亲节|妈妈的妈妈带娃比例提升,托举效果如何?
  • 国家税务总局泰安市税务局:山东泰山啤酒公司欠税超536万元
  • A股低开高走全线上涨:军工股再度领涨,两市成交12934亿元
  • 酒店取消订单加价卖何以屡禁不绝?专家建议建立黑名单并在商家页面醒目标注
  • 体坛联播|双杀阿森纳,巴黎晋级欧冠决赛对阵国际米兰