Spring Boot 整合开源 Tess4J库 实现OCR图片文字识别

在这里插入图片描述

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》本专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
💕《Jenkins实战》专栏主要介绍Jenkins+Docker+Git+Maven的实战教程,让你快速掌握项目CI/CD,是2024年最新的实战教程
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~

Spring Boot整合开源 Tess4J 实现OCR图片文字识别

  • 1、前言
  • 2、什么是 Tess4J
  • 3、项目初始化
    • 3.1 引入Tess4J 依赖
    • 3.2 配置 Tesseract 数据文件
  • 4、代码实现
    • 4.1 创建 OCR 服务类
    • 4.2 创建OCRController
    • 4.3 开始调试
  • 5、出现 Unable to load library 'tesseract'问题
  • 6、总结

1、前言

之前在某一个项目中,客户要求根据上传的文档图片系统自动识别图片内容,这就需要到了OCR技术,我们公司一般做法通常是使用阿里云腾讯云OCR图片识别(大厂的训练量更多更大,识别更精准)无奈客户资金有限,又希望我们满足需求,最后我们决定采用开源Tesseract 文字识别 OCR 引擎来实现

Tesseract 是一个功能强大的 OCR 引擎,其发展经历了多个版本的迭代。最初由惠普实验室开发,后由 Google 维护和发展。Tesseract 通过神经网络和图像处理技术,对图像中的文字进行识别和提取。

2、什么是 Tess4J

Tess4J 是一个 JavaOCR(光学字符识别)库,基于 Tesseract OCR 引擎实现。Tess4J 为 Java 开发者提供了一个便捷的接口,能够在 Java 项目中轻松调用 Tesseract 的 OCR 功能。

温馨提示
Tess4J 只是就是封装了Tesseract OCR的API,让Java可以直接调用,千万不要错误以为是Tess4J实现的

3、项目初始化

3.1 引入Tess4J 依赖

创建 Spring Boot 项目,打开 pom.xml 文件,添加 Tess4J 的依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- tess4j 最新版5.11.0 -->
<dependency>
    <groupId>net.sourceforge.tess4j</groupId>
    <artifactId>tess4j</artifactId>
    <version>5.11.0</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

3.2 配置 Tesseract 数据文件

Tess4J 依赖 Tesseract 数据文件来识别不同语言的文本。可以从 Tesseract Github仓库 下载所需语言的训练数据。
在这里插入图片描述
如上图所示:Tesseract有三个独立的语言模型存储库 tessdata、tessdata-best、tessdata-fast 他们分别都存储了语言模型,主要有以下区别

数据模型存储库描述速度识别精度支持再训练
tessdata_best最好(最准确)的训练LSTM模型最慢最高支持
tessdata使用“最佳”LSTM模型+遗留模型的快速变体训练模型均衡均衡不支持
tessdata_fast训练LSTM模型的快速版本最快最低不支持

博主选择Tesseract最高的 tessdata_best 中文数据文件,下载完成后,将数据文件放在项目的资源目录中,src/main/resources/tessdata

如果你只是处理中文、英文的文字识别,无需将整个库下载,找到chi_sim.traineddata 和eng.traineddata下载即可

如果整个存储库下载过大,大家根据自己的需求下载对应语言版本或者特殊的模型(如数学公式:equ.traineddata 模型),语言版本参考官方地址:https://tesseract-ocr.github.io/tessdoc/Data-Files.html
在这里插入图片描述

4、代码实现

4.1 创建 OCR 服务类

首先,创建一个 OCR 服务类,用于处理图片文字识别的逻辑

import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import org.springframework.stereotype.Service;

import java.io.File;

@Service
public class OCRService {
    public String extractTextFromImage(File imageFile) {
        Tesseract instance = new Tesseract();
        //设置 tessdata 目录
        instance.setDatapath("src/main/resources/tessdata");
        //设置语言 中文
        instance.setLanguage("chi_sim");

        try {
            return instance.doOCR(imageFile);
        } catch (TesseractException e) {
            e.printStackTrace();
            return "读取图像时出错";
        }
    }
}

4.2 创建OCRController

创建一个控制器,用于处理前端请求并调用 OCR 服务

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

@RestController
@RequestMapping("/api/ocr")
public class OCRController {

    @Autowired
    private OCRService ocrService;

    @PostMapping("/extract-text")
    public ResponseEntity<String> extractTextFromImage(@RequestParam("file") MultipartFile file) {
        if (file.isEmpty()) {
            return new ResponseEntity<>("未选择图片!", HttpStatus.BAD_REQUEST);
        }

        try {
            // 将 MultipartFile 转换为 File
            File imageFile = convertMultiPartToFile(file);
            String result = ocrService.extractTextFromImage(imageFile);
            return new ResponseEntity<>(result, HttpStatus.OK);
        } catch (Exception e) {
            e.printStackTrace();
            return new ResponseEntity<>("文件处理错误", HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }

    private File convertMultiPartToFile(MultipartFile file) throws IOException {
        File convFile = new File(System.getProperty("java.io.tmpdir") + "/" + file.getOriginalFilename());
        file.transferTo(convFile);
        return convFile;
    }
}

4.3 开始调试

准备一张文字图片,就以本篇文章开头文案图片来测试;

在这里插入图片描述
前端代码这里就不贴了,我们使用Apifox或Postman进行调试,博主这里使用Apifox测试效果如下:
在这里插入图片描述

5、出现 Unable to load library 'tesseract’问题

如果有小伙伴在测试过程中出现了 Unable to load library 'tesseract'的异常问题,且你也是MacOS系统,原因通常是因为 Tess4J 无法找到或加载 Tesseract OCR 引擎的本地库,需要在Mac上安装Tesseract lib

#使用homebrew安装
brew install tesseract

#或者
sudo apt-get install tesseract

6、总结

通过以上步骤,我们成功地在 Spring Boot 项目中集成了 Tess4J,实现了图片文字识别功能。本文详细介绍了从项目初始化、服务类和控制器的编写到最终测试,希望对大家有所帮助。如果有更复杂的需求,可以进一步优化和扩展此项目。


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/676243.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python | 试卷刷题and基础笔记

1.下列转义字符中&#xff0c; 属于“回车”含义的是 \n 换行 \r 回车 2.for循环遍历字典 在Python中&#xff0c;你可以使用for循环来遍历字典的键&#xff08;keys&#xff09;、值&#xff08;values&#xff09;或者键-值对&#xff08;items&#xff09;。下面是三种遍历…

RPA机器人未来的发展方向和趋势

在数字经济的大背景下&#xff0c;众多企业重新寻找自身的创新驱动力&#xff0c;数字化转型需求迎来爆发式增长。在强劲的数字化转型需求以及国家政策的推动下&#xff0c;RPA行业即将迎来更为有利的发展局面。Gartner预测&#xff0c;到2025年&#xff0c;超级自动化市场规模…

【JavaScript】---DOM操作1:获取元素

【JavaScript】—DOM操作1&#xff1a;获取元素 文章目录 【JavaScript】---DOM操作1&#xff1a;获取元素一、什么是DOM&#xff1f;1.1 概念1.2 图例演示 二、查找HTML元素2.1 getElementById()2.2 getElementsByTagName()2.3 getElementsByClassName()2.4 querySelector()2.…

成人本科毕业论文怎么写?分享自己的经验

撰写成人本科毕业论文是一个系统而深入的过程&#xff0c;以下是我个人的经验分享&#xff0c;希望能帮助你更好地完成这一任务&#xff1a; 1. 明确论文选题 兴趣与专长&#xff1a;选择自己感兴趣且有一定专长的领域&#xff0c;这样更容易深入研究。可行性&#xff1a;确保…

NocoDB开源的智能表格详解-腾讯文档本地替代品

文章目录 一、介绍二、docker-compose部署三、登录NocoDB四、NocoDB手册1. 创建项目2. 收集统计表2.1 添加字段2.2 编辑字段2.3 字段类型2.4 发布表格 3.创建表单3.1 创建表单3.2 分享表单3.3 填写检测单 4.创建看板5.创建画廊 一、介绍 可作为腾讯文档的本地电子表格替代品&a…

Springboot作业管理系统的设计与实现-计算机毕业设计源码98119

目 录 摘要 1 绪论 1.1研究背景 1.2研究现状 1.3springboot框架介绍 1.4论文结构与章节安排 2 作业管理系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2…

论文摘要一般要写些什么内容?

论文摘要通常需要包含以下几个关键内容&#xff1a; 研究背景与目的&#xff1a;简要介绍研究的背景信息&#xff0c;包括研究领域的重要性、当前的研究现状以及存在的问题。然后&#xff0c;清晰地阐述研究的目的、研究问题或研究假设&#xff0c;让读者明白研究的出发点和意图…

python 各种画图(2D 3D)-1 _matplotlib 官方网站笔记

背景 需利用python进行3D可视化处理&#xff0c;用于分析python得到的数据的正确性。 知识学习 python高阶3D绘图---pyvista模块&#xff0c;mayavi模块&#xff0c;pyopengl模块&#xff0c;MoviePy模块基础使用-CSDN博客 python用于3D绘图的模块比较多&#xff0c;pyvist…

Apache Doris 基础 -- 数据表设计(表索引)

1、索引概述 索引用于帮助快速过滤或搜索数据。目前&#xff0c;Doris支持两种类型的索引:内置智能索引和用户创建的二级索引。 内置智能索引 排序键和前缀索引:Apache Doris基于排序键以有序的方式存储数据。它为每1024行数据创建一个前缀索引。索引中的键是当前1024行组的…

2024码蹄杯初赛 拔河(非二分解法)

AK选手前来补充一发邪典&#xff08;水数据&#xff09;写法 题面&#xff1a; 简单来说就是给你一个序列&#xff0c;让你选择一段连续区间&#xff0c;使得这个区间平均值最大&#xff0c;同时区间长度大于等于F。 很显然对于区间求和直接用前缀和优化到O(1)&#xff0c;但是…

代码随想录 day 26

回溯 组合总和 题意&#xff1a;一个无重复元素的整数数组&#xff1b;一个目标整数target&#xff1b; 找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff1b;并以列表形式返回。candidates 的同一个数字可以无限制重复被选取。 思路&#xff1a;因为…

半导体光子电学期末笔记2: 光子晶体 Photonic crystals

光子晶体概述 光子晶体定义和分类 [P4-5] 光子晶体是一种在一维、二维或三维空间内周期性排列的多层介质。这些结构通过在光子尺度上排列的重复单元&#xff0c;可以对光进行调控和控制。具体来说&#xff0c;光子晶体是指那些在空间上具有周期性排列的介质结构&#xff0c;它…

文心一言 VS 讯飞星火 VS chatgpt (273)-- 算法导论20.2 8题

八、假设设计了这样一个 proto-vEB 结构&#xff0c;其中每个簇数组仅有 u 1 4 u^\frac{1}{4} u41​ 个元素。那么每个操作的运行时间是多少&#xff1f;如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 如果你修改了 van Emde Boas (vEB) 树中的簇大小&#xf…

贪心算法题实战详解

文章目录 例题1&#xff1a;活动安排问题例题2&#xff1a;货币找零问题例题3&#xff1a;分数背包问题&#xff08;部分背包问题&#xff09;例题4&#xff1a;最小生成树问题&#xff08;Prim算法&#xff09;例题5&#xff1a;哈夫曼编码例题6&#xff1a;活动选择问题例题7…

KAN(Kolmogorov-Arnold Network)的理解 3

系列文章目录 第一部分 KAN的理解——数学背景 第二部分 KAN的理解——网络结构 第三部分 KAN的实践——第一个例程 文章目录 系列文章目录前言KAN 的第一个例程 get started 前言 这里记录我对于KAN的探索过程&#xff0c;每次会尝试理解解释一部分问题。欢迎大家和我一起讨…

Spring 之 Lifecycle 及 SmartLifecycle

最近在看Eureka源码&#xff0c;本想快速解决这场没有硝烟的战役&#xff0c;不曾想阻塞性问题一个接一个。为正确理解这个框架&#xff0c;我不得不耐着性子&#xff0c;慢慢梳理这些让人困惑的点。譬如本章要梳理的Lifecycle和SmartLifecycle。它们均为接口&#xff0c;其中后…

【TB作品】MSP430F149单片机,广告牌,滚动显示

LCD1602滚动显示切换播放暂停字符串 显示Public Places 显示No Smoking 播放 暂停 部分代码 char zifu1[] "Public Places "; char zifu2[] "Class Now "; char zifu3[] "No admittance "; char *zifu[] { zifu1, zifu2, zifu3 }…

【kafka】关于Kafka的入门介绍

为什么要使用kafka&#xff1f;kafka是什么东西&#xff1f; 案例场景 A服务向B服务发送消息&#xff0c;A服务传输数据很快&#xff0c;B服务处理数据很慢&#xff0c;这样B服务就会承受不住&#xff0c;怎么办&#xff1f;通过添加消息队列作为缓冲。kafka就是消息队列中的…

使用Xshell一键在多个会话中执行多个命令

背景 平时在工作中经常通过ssh远程操作Linux&#xff0c;由于我们负责的服务部署在超过5台服务器&#xff08;相同的代码及路径&#xff09;&#xff0c;每次发布后执行重启都得重复操作5次关闭、检查、启动、查看日志&#xff0c;特别繁琐。 后来发现Xshell 7可以录制脚本&am…

This may be due to a blocked port, missing dependencies

安装XAMPPXAMPP之后启动mysql出现如下问题&#xff0c;只需双击XAMPP安装目录下的setup_xampp&#xff0c;等待运行完毕。 重启&#xff0c;双击xampp-control. 重新进入xampp控制界面&#xff0c;点击start。