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 {@Autowiredprivate OCRService ocrService;@PostMapping("/extract-text")public ResponseEntity<String> extractTextFromImage(@RequestParam("file") MultipartFile file) {if (file.isEmpty()) {return new ResponseEntity<>("未选择图片!", HttpStatus.BAD_REQUEST);}try {// 将 MultipartFile 转换为 FileFile 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,实现了图片文字识别功能。本文详细介绍了从项目初始化、服务类和控制器的编写到最终测试,希望对大家有所帮助。如果有更复杂的需求,可以进一步优化和扩展此项目。


在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图片去手写软件有哪些?这三款值得一试!

图片去手写软件有哪些&#xff1f;在当今数字化时代&#xff0c;图片处理与编辑已成为我们日常生活中不可或缺的一部分。特别是在处理手写笔记、涂鸦或草图时&#xff0c;图片去手写软件发挥着至关重要的作用。它们能够帮助我们轻松去除图片中的手写内容&#xff0c;使图片更加…

高中数学:解三角形-大题练习

例题1 解析 第一小问 根据条件等式&#xff0c;我们发现&#xff0c;每一项都含有边&#xff0c;但是&#xff0c;不是每一项都含有角 于是&#xff0c;我们要想到用正弦定理把边换为角来解答该题 第二小问 例题2 解析 第一小问 两个等式条件&#xff0c;各个项都含有边&…

工业相机识别电路板元器件:彩色与黑白的区别

工业相机用于识别电路板上的元器件时&#xff0c;选择彩色相机或黑白相机取决于具体应用需求和条件。彩色相机能提供更丰富的信息&#xff0c;但处理复杂度较高&#xff1b;黑白相机则在处理速度和精度上具有优势。理解它们的区别和各自的优缺点&#xff0c;有助于在具体项目中…

C语言| 输出菱形*(梳理篇II)

C语言| 输出菱形*-CSDN博客 凡事还是得自己独立思考后&#xff0c;写一遍程序才能发现问题所在。 容易犯的错误&#xff1a; 【完整程序注释】 运行结果 /* 输出菱形 1 总行数 n为奇数&#xff0c;分上三角形下三角形&#xff0c;只考虑左边的空格和星号* 2 上三角形 行数…

k8s怎么监听资源的变更

监听k8s所有的 Deployment 资源 package mainimport ("context""fmt"v1 "k8s.io/api/apps/v1""k8s.io/apimachinery/pkg/util/json""k8s.io/client-go/informers""k8s.io/client-go/kubernetes""k8s.io/cli…

本人自己Python安装和配置无套路分享

初学者是不是经常被python的各种问题困扰&#xff0c;教你轻松配置好这一切 如果你已经安装了python可以直接跳到你需要的内容 安装python 如果你是Linux系统可以直接使用包管理器安装包(对于linux系统管理员应该是轻车熟路了) Debian/Ubuntu系统: sudo apt update sudo ap…

【GD32】06 - SPI (含ST7735S TFT-LCD屏幕驱动)

这篇文章我们看看GD32中如何实现SPI&#xff0c;软件SPI的话可以参考我之前的文章&#xff0c;把对应操作GPIO口的代码从STM32改成GD32就可以使用了。 【快速上手STM32】SPI通信协议&&1.8寸TFT-LCD&#xff08;ST7735S&#xff09;_tftlcdst7735和stm32-CSDN博客文章浏…

攻防世界maze做法(迷宫题)

首先查壳64bit&#xff0c;直接丢进ida64中进行反编译就完事儿了&#xff0c;然后直接进入main函数打注释分析首先&#xff0c;题目已经提示了这是个迷宫题&#xff0c;我们抓住做迷宫题的两个要点&#xff0c;一找玩法&#xff0c;二找地图&#xff0c; 玩法在主函数中&#…

Linux防火墙入门——iptables、firewalld配置详解

合理的防火墙是你的计算机防止网络入侵的第一道屏障。你在家里上网&#xff0c;通常互联网服务提供会在路由中搭建一层防火墙。当你离开家时&#xff0c;那么你计算机上的那层防火墙就是仅有的一层&#xff0c;所以配置和控制好你 Linux 电脑上的防火墙很重要。 很多 Linux 发…

微信视频号上是怎么开店铺的?从入驻到发货,具体流程来了!

这两年&#xff0c;视频号逐渐走入大家视野 单价高&#xff0c;商家又少&#xff0c;很多类目都属于空白无商家入驻阶段&#xff0c;于是好多商家&#xff0c;都准备去视频号小店这个新“黑马”发展发展 那视频号是怎么开店卖东西的&#xff1f;今天我就来给大家分享一下&…

外汇天眼:总是权衡利弊,投资注定失败

投资股票的人往往会频繁地评估自己的投资结果&#xff0c;尤其是在信息时代&#xff0c;手机上随时可以查看股票行情&#xff0c;导致很多人时不时地打开行情软件&#xff0c;看一看自己的股票是涨了还是跌了&#xff0c;盈利了还是亏损了。 频繁评估结果的弊端 一、引发急躁…

导入和使用标准模块

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在Python中&#xff0c;自带了很多实用的模块&#xff0c;称为标准模块&#xff08;也可以称为标准库&#xff09;&#xff0c;对于标准模块&#xf…

每日一练——分糖果2

1103. 分糖果 II - 力扣&#xff08;LeetCode&#xff09; /*** Note: The returned array must be malloced, assume caller calls free().*/ int* distributeCandies(int candies, int num_people, int* returnSize) {int num 0;int* arr (int*)malloc(sizeof(int)*num_peo…

学习小心意——简单的循坏语句

for循坏 基本语法格式 for 变量 in 序列:代码块 示例代码如下 for i in range(10):print(i)#输出结果:0 1 2 3 4 5 6 7 8 9 简单案例代码如下 利用for语句遍历序列 # 遍历字符串打印每个字母 for letter in "python":print(letter)# 遍历列表并打印每个元素 a …

软件功能测试内容简析,第三方软件测试机构进行功能测试的好处

软件功能测试是指对软件产品的各项功能进行验证和确认的过程。它是软件开发过程中非常重要的一环&#xff0c;通过对软件的功能进行全面测试&#xff0c;可以确保软件在交付给用户之前达到预期的质量要求。 在进行功能测试时&#xff0c;需要包括以下几个方面的测试内容&#…

索尼CEO宣布全力推进AI电影制作,《蜘蛛侠》制片人坚称不用AI

原标题&#xff1a;索尼互娱制片人与CEO唱反调 易采游戏网6月3日消息&#xff1a;在最近的一次行业会议上&#xff0c;索尼影业高层首席执行官托尼文西奎拉向媒体透露&#xff0c;索尼正在全力推进人工智能(AI)技术的研发与应用&#xff0c;特别是在电影制作流程中。这一策略旨…

React@16.x(17)Portals

目录 1&#xff0c;使用2&#xff0c;事件冒泡 一句话总结&#xff1a;和 Vue3 的 Teleport 一个效果。 1&#xff0c;使用 import React, { PureComponent } from "react"; import ReactDOM from "react-dom";// 返回一个 React 元素&#xff08;ReactNo…

如何快速的将Excel定义的表结构变成MySQL的建表语句

如何快速的将Excel定义的表结构变成MySQL的建表语句 最近需求有点多啊&#xff0c;做一个小需求就有一堆表结构&#xff0c;一个一个实行CV大法&#xff0c;实在太伤身体了&#xff0c;有没有能够快速便捷的方法将一大堆Excel表转换成MySQL的表结构建表语句呢&#xff0c;网上…

Kafka之Consumer原理

1. Kafka消息消费流程 kafka的消费流程&#xff0c;首先是producer生产消息经过处理后放入到Broker服务器中&#xff0c;然后进入到内存中&#xff0c;内存再进行刷盘到磁盘中&#xff0c;kafak提供了两种刷盘策略&#xff0c;同步刷盘(flush.message 一次IO刷盘多少消息)和异…

音频pop音的数学与物理解释

音频数据跳变太大的时候通常会有pop音&#xff0c;此时频谱上看pop音位置能量较高 音频中的“pop”音通常是由于信号的不连续性或瞬态变化造成的。这种不连续性的数学和物理原因可以从以下几个方面解释&#xff1a; 数学解释 信号不连续性 当音频信号发生突变时&#xff0c;…