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

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,实现了图片文字识别功能。本文详细介绍了从项目初始化、服务类和控制器的编写到最终测试,希望对大家有所帮助。如果有更复杂的需求,可以进一步优化和扩展此项目。


在这里插入图片描述

相关文章:

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

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…...

使用 Docker 和 Docker Compose 部署 Vue

使用 Docker 和 Docker Compose 部署 Vue 项目有两种方式&#xff1a;直接使用 Docker 和使用 Docker Compose。 创建 Dockerfile 在Vue.js项目根目录下创建一个 Dockerfile 的文件 # 使用最新的官方 Node.js 镜像作为基础镜像&#xff0c;并命名为 builder 阶段 FROM node:…...

力扣linkedlist

反转链表、 public class reverseList { // 1->2->3->o 、 o<-1<-2<-3public ListNode reverseList(ListNode head){//反转链表ListNode prevnull;ListNode currhead;while(curr!null){ListNode nextcurr.next;curr.nextprev;prevcurr;currnext;}retu…...

springboot 启动原理、启动过程、启动机制的介绍

Spring Boot 是一种基于 Java 的框架,用于创建独立的、生产级别的 Spring 应用程序。它的主要目标是简化 Spring 应用的初始搭建和开发过程,同时提供一系列大型项目常见的非功能性特征(如嵌入式服务器、安全性、度量、健康检查和外部化配置)。以下是 Spring Boot 的一些核心…...

大模型ChatGLM的部署与微调

前言&#xff1a;最近大模型太火了&#xff0c;导师让我看看能不能用到自己的实验中&#xff0c;就想着先微调一个chatGLM试试水&#xff0c;微调的过程并不难&#xff0c;难的的硬件条件跟不上&#xff0c;我试了一下lora微调&#xff0c;也算跑通了吧&#xff0c;虽然最后评估…...

全球七家半导体工厂建设受阻:英特尔、三星、台积电等面临延期挑战

过去两年间&#xff0c;半导体行业经历了市场衰退、复苏慢于预期以及资金紧缩等问题&#xff0c;英特尔、台积电和三星等主要企业虽然继续推进扩张计划&#xff0c;但不断调整和放缓工厂建设的步伐与时间表&#xff0c;以更好地服务于长期发展目标。据统计&#xff0c;全球范围…...

JavaScript错误;调试;“=”,“==”,“===”的区别

try...catch语句 try..catch语句是JavaScript中用来处理异常的一种方式。它允许我们在代码块中尝试执行可能会引发错误的代码&#xff0c;并在发生错误时捕获并处理异常。 下面是try..catch语句的基本语法&#xff1a; try {// 可能会引发错误的代码 } catch (error) {// 处理…...

thinkphp6的请求

由于笔者是刚入门thinkphp&#xff0c;所以学习时对照thinkphp的官网&#xff0c;各位读者也可以对照官网学习。还麻烦各位笔者一键三连&#xff0c;谢谢。 1.请求对象 当前的请求对象由think\Request类负责&#xff0c;该类不需要单独实例化调用&#xff0c;通常使用依赖注入…...

ant design vue 表格错位,表头错位

ant design vue 表格错位,表头错位 在官网中,我们可以看到下面图片的描述: 好的,我们按照官网来一波,前面都设置了固定宽度,娃哈哈就不设置了.会出现下面效果 为啥会多了一个竖线(因为按照官网来一波x:1300,这个1300太小的原因) 3.那我们把1300改成1600,1700试试,结果也不是…...

【小白向】微信小程序解密反编译教程

# 前言 最近笔者有做到微信小程序的渗透测试&#xff0c;其中有一个环节就是对微信小程序的反编译进行源码分析&#xff0c;所谓微信小程序反编译&#xff0c;就是将访问的小程序进行反向编译拿到部分源码&#xff0c;然后对源码进行安全审计&#xff0c;分析出其中可能存在的…...

Flutter基础 -- Dart 语言 -- 类抽象接口继承函数库

目录 1. 类 class 1.1 定义、使用类 1.2 构造函数 1.3 初始化列表 1.4 命名构造函数 1.5 重定向构造函数 1.6 callable 2. 类 get set 2.1 定义、使用 get set 2.2 简化 get set 2.3 业务场景 3. 静态 static 3.1 static 定义 3.2 函数内部访问 3.3 静态方法 3…...

【TB作品】msp430单片机,播放蜂鸣器音乐,天空之城

功能 msp430单片机&#xff0c;连接一个无源蜂鸣器&#xff0c;播放蜂鸣器音乐&#xff0c;天空之城。 适用于所有msp430单片机。 硬件 无源蜂鸣器&#xff0c;接单片机P1.5&#xff0c;使用vcc3.3v供电。 如果根据简谱修改音乐? //第一步 //首先修改music0 的变量&…...

C语言(数据存储)

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#xff0c;在这里撰写成文一…...

Linux shell编程学习笔记56:date命令——显示或设置系统时间与日期

0 前言 2024年的网络安全检查又开始了&#xff0c;对于使用基于Linux的国产电脑&#xff0c;我们可以编写一个脚本来收集系统的有关信息。在收集的信息中&#xff0c;应该有一条是搜索信息的时间。 1. date命令 的功能、格式和选项说明 我们可以使用命令 date --help 来查看 d…...

Realsense的一些事情

Realsense的一些事情 librealsense的安装 官网教程&#xff1a; apt 安装教程&#xff1a; https://github.com/IntelRealSense/librealsense/blob/master/doc/distribution_linux.md自行clone并编译教程&#xff1a; https://github.com/IntelRealSense/librealsense/blo…...

CISCN 2023 初赛 被加密的生产流量

题目附件给了 modbus.pcap 存在多个协议 但是这道题多半是 考 modbus 会发现 每次的 Query 末尾的两个字符 存在规律 猜测是base家族 可以尝试提取流量中的数据 其中Word Count字段中的22871 是10进制转16进制在转ascii字符串 先提取 过滤器判断字段 tshark -r modbus.pcap …...

初识C语言第三十天——设计三子棋游戏

目录 一.设计游戏框架 1.打印游戏菜单 2.输入选择判断&#xff08;玩游戏/游戏结束/输入错误重新输入&#xff09; 二、玩游戏过程设计 1.设计棋格存放棋子——二维数组 2.初始化棋盘——初始化为空格 3.打印棋盘——本质上就是打印数组 4.游戏过程——1.玩家走棋 2.…...

ehcache3多级缓存应用

项目中如果有使用大量的本地缓存场景&#xff0c;可以使用redisehcache组合缓存&#xff0c;优先使用ehcache本地缓存&#xff0c;本地缓存没有查询到再使用redis缓存 可看前文中如何集成 本地缓存使用存在的问题 1、本地缓存如何保证缓存的是最新值 可定义版本号、自增id或者…...

C# WinForm —— 24 Threading.Timer 组件介绍与使用

1. 简介 System.Threading.Timer 多线程 轻量级 精度高 提供以指定的时间间隔对线程池线程执行方法的机制 和System.Timers.Timer 类似&#xff0c;每隔一段时间触发事件&#xff0c;执行操作(不是由UI线程执行的)&#xff0c;即使事件中执行了比较耗时的操作&#xff0c;也…...

03-07Java自动化之JAVA基础之循环

JAVA基础之循环 一、for循环 1.1for循环的含义 for&#xff08;初始化语句;条件判断;条件控制或–&#xff09;{ ​ //代码语句 } 1、首先执行初始话语句&#xff0c;给变量一个起始的值 2、条件判断进行判断&#xff0c;为true&#xff0c;执行循环体中的代码语句 ​ …...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...