【SpringBoot框架篇】36.整合Tess4J搭建提供图片文字识别的Web服务

文章目录

  • 简介
  • 文件下载
  • 引入依赖
  • main函数中使用
  • 基于Springboot搭建OCR Web服务
    • 配置traineddata路径
    • 枚举用到的语种类型
    • 定义接口响应的json数据格式
    • 封装OCR服务引擎
    • 编写web提供服务的接口
    • 启动服务并且测试
    • html demo扩展
  • 项目配套代码

简介

  • Tess4J是一个基于Tesseract OCR引擎的Java接口,可以用来识别图像中的文本。
  • Tesseract是一个开源的光学字符识别(OCR)引擎,它可以将图像中的文字转换为计算机可读的文本。支持多种语言和书面语言,并且可以在命令行中执行。它是一个流行的开源OCR工具,可以在许多不同的操作系统上运行。

文件下载

目前我测试只用到简体中文和英文,所以只下载了两个
简体中文下载
英文下载

其它语种请按需下载

把下载后的文件统一放到一个目录下
在这里插入图片描述

引入依赖

      	<dependency><groupId>net.sourceforge.tess4j</groupId><artifactId>tess4j</artifactId><version>5.10.0</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>

main函数中使用

    public static void main(String[] args) throws Exception {ITesseract tesseract = new Tesseract();// 设置训练集文件存储目录tesseract.setDatapath("D:/traineddata");// 设置引擎为中文简体 文件名不含后缀tesseract.setLanguage("chi_sim");String result = tesseract.doOCR(ImageIO.read(new File("D:\\test\\zh.png")));System.out.println(result);// 设置引擎为英文tesseract.setLanguage("eng");result = tesseract.doOCR(ImageIO.read(new File("D:\\test\\en.png")));System.out.println(result);}

识别结果如下
在这里插入图片描述
在这里插入图片描述

基于Springboot搭建OCR Web服务

配置traineddata路径

application.yaml中配置如下内容

server:port: 8036
#ocr引擎存放路径
tess4j:datapath: D:/traineddata

枚举用到的语种类型

/*** @Description 自行扩展需要的OCR引擎语种* @Author Dominick Li**/
@Getter
@AllArgsConstructor
public enum LanguageTypeEnum {CHINESE_SIMPLIFIED("chi_sim", "简体中文"),ENGLISH("eng", "英文");private final String value;private final String language;/*** 根据语种查找枚举对象* @param language 前端传的参数* @return 没找到对应的则默认使用简单中文*/public static LanguageTypeEnum getLanguageByType(String language) {for (LanguageTypeEnum languageTypeEnum : LanguageTypeEnum.values()) {if (languageTypeEnum.getValue().equals(language)) {return languageTypeEnum;}}return CHINESE_SIMPLIFIED;}}

定义接口响应的json数据格式

@Data
@Builder
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class OcrResult {/*** 是否识别成功*/public boolean success;/*** 识别时间*/public long time;/*** 识别结果*/public String[] texts;/*** 异常信息*/public String msg;public static OcrResult success(String text, long time) {return OcrResult.builder().success(true).texts(text.split("\n")).time(time).build();}public static OcrResult fail(String msg) {return OcrResult.builder().success(false).msg(msg).build();}}

封装OCR服务引擎

@Slf4j
@Service
public class TesseractServer {@Value("${tess4j.datapath}")private String datapath;private final static Map<LanguageTypeEnum, ITesseract> SERVER_INSTANCE = new HashMap<>();/*** 根据枚举配置的语种初始化Tesseract引擎*/@PostConstructpublic void init() {ITesseract iTesseract;for (LanguageTypeEnum languageTypeEnum : LanguageTypeEnum.values()) {iTesseract = new Tesseract();//设置训练集文件存储目录iTesseract.setDatapath(datapath);//设置语种iTesseract.setLanguage(languageTypeEnum.getValue());SERVER_INSTANCE.put(languageTypeEnum, iTesseract);log.info("load {}  ocr model", languageTypeEnum.getLanguage());}}/*** ocr识别*/private OcrResult doOCR(ITesseract iTesseract, BufferedImage bufferedImage) throws Exception {String result = null;long startTime = System.currentTimeMillis();result = iTesseract.doOCR(bufferedImage);long time = System.currentTimeMillis()-startTime;log.info("Time is: {} 毫秒", time);return OcrResult.success(result, time);}public OcrResult ocrImage(LanguageTypeEnum languageTypeEnum, File file) throws Exception {return doOCR(SERVER_INSTANCE.get(languageTypeEnum), ImageIO.read(file));}public OcrResult ocrImage(LanguageTypeEnum languageTypeEnum, MultipartFile file) throws Exception {return ocrImage(languageTypeEnum, ImageIO.read(new ByteArrayInputStream(file.getBytes())));}public OcrResult ocrImage(LanguageTypeEnum languageTypeEnum, BufferedImage bufferedImage) throws Exception {return doOCR(SERVER_INSTANCE.get(languageTypeEnum), bufferedImage);}}

编写web提供服务的接口

@Slf4j
@RestController
@RequestMapping("/api")
public class OcrController {@Resourceprivate TesseractServer tesseractServer;/*** OCR识别  /ocr/chi_sim          /ocr/eng* @param language 使用的模型语种  chi_sim=简体中文  eng=英文* @param file 需要识别的图片*/@PostMapping("/ocr/{language}")public OcrResult recognize(@PathVariable String language, MultipartFile file) {try {// 对图片进行文字识别return tesseractServer.ocrImage(LanguageTypeEnum.getLanguageByType(language), file);} catch (Exception e) {log.error("error:{}", e.getMessage());return OcrResult.fail(e.getMessage());}}}

启动服务并且测试

http://127.0.0.1:8036/api/ocr/chi_sim 中文引擎识别
http://127.0.0.1:8036/api/ocr/eng 英文引擎识别
在这里插入图片描述

到此基于Springboot框架搭建提供Ocr能力的Web服务就完成

html demo扩展

基于html + jquery 搭建的简陋的demo, 访问路径http://127.0.0.1:8036/index.html
在这里插入图片描述

index.html文件源码,放到项目resources/static目录下即可

<!DOCTYPE html>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/><title>OCR测试页面</title>
</head>
<style type="text/css">#app {display: flex;margin: 50px;height: 1000px;}#app div {padding: 50px;width: 50%;border: solid 1px #000;height: 100%;}
</style>
<body>
<div id="app"><div id="left" class="upload-box clear"><input type="file" id="fileInput">选择OCR识别使用的语种<input type="radio" name="language" value="zh_sim" checked="checked"/> 简体中文<input type="radio" name="language" value="eng"/> 英文<input id="summit" type="button" value="识别"></br><img id="previewImage" src="" alt="Preview Image" width="100%"></div><div><h2>识别结果</h2><p>识别时间:<span id="time"></span>毫秒</p><p id="resust"></p></div>
</div><script src="https://cdn.staticfile.org/jquery/3.1.0/jquery.min.js"></script>
<script type="text/javascript">const fileInput = document.getElementById('fileInput');const previewImage = document.getElementById('previewImage');fileInput.addEventListener('change', function () {const file = fileInput.files[0]; // 获取选中的文件对象if (file) {let language = $('input[name="language"]:checked').val();uploadOcr(file, language);const reader = new FileReader();reader.addEventListener('load', function () {// 当文件读取完成时触发的事件处理函数previewImage.src = reader.result;});reader.readAsDataURL(file);}});document.getElementById('summit').addEventListener('click', function () {const file = fileInput.files[0]; // 获取选中的文件对象let language = $('input[name="language"]:checked').val();uploadOcr(file, language);})function uploadOcr(file, language) {var formData = new FormData();formData.append('file', file);$.ajax({url: "/api/ocr/" + language, // 上传图片的后端接口地址type: 'POST',data: formData,processData: false,contentType: false,success: function (response) {// 上传成功后的处理逻辑console.log('上传成功' + response);$("#time").html(response.time);if (response.success) {$("#resust").html("");for (var i = 0; i < response.texts.length; i++) {$("#resust").append(response.texts[i]).append("<br/>");}}},error: function (xhr, status, error) {// 上传失败后的处理逻辑console.log('上传失败');}});}
</script>
</body>
</html>

项目配套代码

gitee代码地址

创作不易,要是觉得我写的对你有点帮助的话,麻烦在gitee上帮我点下 Star

【SpringBoot框架篇】其它文章如下,后续会继续更新。

  • 1.搭建第一个springboot项目
  • 2.Thymeleaf模板引擎实战
  • 3.优化代码,让代码更简洁高效
  • 4.集成jta-atomikos实现分布式事务
  • 5.分布式锁的实现方式
  • 6.docker部署,并挂载配置文件到宿主机上面
  • 7.项目发布到生产环境
  • 8.搭建自己的spring-boot-starter
  • 9.dubbo入门实战
  • 10.API接口限流实战
  • 11.Spring Data Jpa实战
  • 12.使用druid的monitor工具查看sql执行性能
  • 13.使用springboot admin对springboot应用进行监控
  • 14.mybatis-plus实战
  • 15.使用shiro对web应用进行权限认证
  • 16.security整合jwt实现对前后端分离的项目进行权限认证
  • 17.使用swagger2生成RESTful风格的接口文档
  • 18.使用Netty加websocket实现在线聊天功能
  • 19.使用spring-session加redis来实现session共享
  • 20.自定义@Configuration配置类启用开关
  • 21.对springboot框架编译后的jar文件瘦身
  • 22.集成RocketMQ实现消息发布和订阅
  • 23.集成smart-doc插件零侵入自动生成RESTful格式API文档
  • 24.集成FastDFS实现文件的分布式存储
  • 25.集成Minio实现文件的私有化对象存储
  • 26.集成spring-boot-starter-validation对接口参数校验
  • 27.集成mail实现邮件推送带网页样式的消息
  • 28.使用JdbcTemplate操作数据库
  • 29.Jpa+vue实现单模型的低代码平台
  • 30.使用sharding-jdbc实现读写分离和分库分表
  • 31.基于分布式锁或xxx-job实现分布式任务调度
  • 32.基于注解+redis实现表单防重复提交
  • 33.优雅集成i18n实现国际化信息返回
  • 34.使用Spring Retry完成任务的重试
  • 35.kafka环境搭建和收发消息
  • 36.整合Tess4J搭建提供图片文字识别的Web服务

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

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

相关文章

网上超市系统|基于Springboot的网上超市系统设计与实现(源码+数据库+文档)

网上超市系统目录 目录 基于Springboot的网上超市系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、商品信息管理 2、用户管理 1、 商品信息 2、购物车 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、…

重要通告 | 公司更名为“浙江实在智能科技有限公司”

更名公告 升级蜕变、砥砺前行 因业务快速发展和战略升级&#xff0c;经相关政府机构批准&#xff0c;自2024年3月1日起&#xff0c;原“杭州实在智能科技有限公司”正式更名为“浙江实在智能科技有限公司”。 更名后&#xff0c;公司统一社会信用代码不变&#xff0c;业务主体…

力扣hot100:152.乘积最大子数组(动态规划)

一个子数组问题&#xff0c;我们要使用线性dp&#xff0c;最好先考虑以i结尾&#xff0c;如果定义dp[i]为前i个数最大子数组乘积值 那么dp[i-1]就无法转移到dp[i]。因此我们先考虑dp[i]定义为以第i个数结尾的最大子数组乘积值。 53. 最大子数组和 最大子数组和是一个动态规划问…

b树(一篇文章带你 理解 )

目录 一、引言 二、B树的基本定义 三、B树的性质与操作 1 查找操作 2 插入操作 3 删除操作 四、B树的应用场景 1 数据库索引 2 文件系统 3 网络路由表 五、哪些数据库系统不使用B树进行索引 1 列式数据库 2 图形数据库 3 内存数据库 4 NoSQL数据库 5 分布式数据…

yolov5体验

无须安装CUDA&#xff0c;只需要有NVIDIA图形驱动即可 1. 安装Miniconda miniconda下载地址 1.1 安装细节 一个对勾都不要选择 1.2 配置环境变量 在环境变量Path中添加如下变量 C:\Server\miniconda C:\Server\miniconda\Scripts C:\Server\miniconda\Library\bin2. …

不同路径 不同路径 II 整数拆分

62.不同路径 力扣题目链接(opens new window) 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。…

mysql题库详解

1、如何创建和删除数据库&#xff1f; 创建数据库 CREATE DATABASE 数据库名; 删除数据库 drop database 数据库名; 2、MyISAM与InnoDB的区别&#xff1f; 1&#xff09;事务&#xff1a;MyISAM 不支持事务 InnoDB 支持 2&#xff09;行锁/表锁&#xff1a;MyISAM 支持表级锁…

冒险和预测

前言 大家好我是jiantaoyab&#xff0c;这是我所总结作为学习的笔记第十篇,在这里分享给大家,还有一些书籍《深入理解计算机系统》&#xff0c;《计算机体系结构&#xff1a;量化研究方法》&#xff0c;这篇文章讲冒险和预测 流水线设计需要解决的三大冒险&#xff0c;分别是结…

CodeReview 规范及实施

优质博文&#xff1a;IT-BLOG-CN 一、为什么需要CodeReview 随着业务压力增大&#xff0c;引发代码质量下降&#xff0c;代码质量的下降导致了开发效率的降低&#xff0c;维护成功高等问题&#xff0c;开发效率下降后又加重了业务压力&#xff0c;最终陷入了死亡三角的内耗之…

VScode的列选

可以用来优化代码排布&#xff0c;让变量整齐成为一排 一、批量复制&#xff1a; 在1处左键单击&#xff0c;然后摁住SHIFTALT键的同时&#xff0c;左键单击2处&#xff0c;即可复制一整块的内容 如果所示 就可以复制了 二、批量输入 在1处左键单击&#xff0c;然后摁住SHI…

基于斑翠鸟优化算法(Pied Kingfisher Optimizer ,PKO)的无人机三维路径规划(MATLAB)

一、无人机路径规划模型介绍 二、算法介绍 斑翠鸟优化算法&#xff08;Pied Kingfisher Optimizer ,PKO&#xff09;&#xff0c;是由Abdelazim Hussien于2024年提出的一种基于群体的新型元启发式算法&#xff0c;它从自然界中观察到的斑翠鸟独特的狩猎行为和共生关系中汲取灵…

Linux系统中的任务迁移技术

任务迁移技术是指将任务从一个处理器核心&#xff08;CPU核心&#xff09;移动到另一个核心的过程&#xff0c;以实现负载均衡、优化系统性能或者其他系统目标的技术。任务迁移技术在多核系统中具有重要的作用&#xff0c;可以通过动态调整任务位置来避免负载不均衡和性能瓶颈&…

【工具】Git的24种常用命令

相关链接 传送门&#xff1a;>>>【工具】Git的介绍与安装<< 1.Git配置邮箱和用户 第一次使用Git软件&#xff0c;需要告诉Git软件你的名称和邮箱&#xff0c;否则无法将文件纳入到版本库中进行版本管理。 原因&#xff1a;多人协作时&#xff0c;不同的用户可…

恒驰上云规划实施解决方案上线华为云官网

华为云与伙伴共同打造联合解决方案 已成为更多企业的数字化转型利器 1月恒驰上云规划实施解决方案 完成上市宣讲并正式上架华为云官网 恒驰上云规划实施解决方案能力全景图&#xff1a;融合厂商云服务能力&#xff0c;一站式高效云迁移 从深入了解企业的本地IT环境、业务特点…

分享一下 iOS 发布/测试证书 申请过程

1.使用 已开通iOS开发者 的账号登陆 Apple Developer Apple Developer 2.点击下图右上角的 Account&#xff08;账户&#xff09; 点击下图中的 certificates&#xff08;证书&#xff09; 然后会挑战至下图所示页面 3.然后先要注册一个 App id 点击 register 就完成了 4.…

【JAVA】CSS2:样式、选择器、伪类、颜色、字体、边框、列表、背景、盒子、布局、浮动

本文介绍了CSS样式、选择器、伪类、像素、颜色、字体、边框、列表、表格属性、背景、盒子、布局与浮动 1.样式 1.1 行内样式 <h1 style"color: aqua;font-size: large;">123</h1> 1.2 内部样式 <style>h1{color: red;font: 100;}</style>…

Oracle SQL优化(读懂执行计划 一)

目录 SQL执行计划的作用示例演示执行计划概念介绍执行计划实例DISPLAY_CURSOR 类型DISPLAY_AWR 类型 指标详解 SQL执行计划的作用 示例演示 执行计划概念介绍 执行计划实例 DISPLAY_CURSOR 类型 DISPLAY_AWR 类型 指标详解

vim基础命令

目录 前言 一.vim基础命令大全 二.vim熟练的好处 三.入门使用命令 四.使用案例 4.1 gg和G 4.2 i 和 u 和 ESC使用 4.3 y$ 和 p 和 u 使用 五.注意事项 前言 启动vim编辑器后自动进入编辑模式&#xff0c;在此模式中输入命令对应vim一个动作&#xff0c;比如&#xff1a;进入编辑…

linux 配置jdk环境变量

1.确保已上传jdk包到指定目录 2.打开终端&#xff0c;使用文本编辑器&#xff08;比如vi、nano等&#xff09;创建或修改~/.bashrc文件。命令为&#xff1a; sudo vi ~/.bashrc3.在.bashrc文件末添加以下内容&#xff1a; export JAVA_HOME/usr/local/jdk/jdk1.8.0_391 #将…

理解STM32的低功耗模式

低功耗模式简介 TM32的低功耗模式是特别设计来减少微控制器在不活跃状态下的能耗。这些模式允许STM32在保持核心功能的同时尽可能减少电力消耗&#xff0c;适合用在电池供电或需长期运行的场景。理解各种低功耗模式如何节能&#xff0c;主要包括以下几个方面&#xff1a; 关闭…