Java也能做OCR!SpringBoot 整合 Tess4J 实现图片文字识别
前言
今天给大家分享一个
SpringBoot
整合Tess4j
库实现图片文字识别的小案例,希望xdm喜欢。文末有案例代码的Git地址,可以自己下载了去玩玩儿或继续扩展也行。
话不多说,开整吧。
什么是Tess4j库
先简单给没听过的xdm解释下,这里要分清楚
Tesseract
和Tess4j
的区别。
Tesseract
是一个开源的光学字符识别(OCR)引擎,它可以将图像中的文字转换为计算机可读的文本。支持多种语言和书面语言,并且可以在命令行中执行。它是一个流行的开源OCR工具,可以在许多不同的操作系统上运行。
Tess4J
是一个基于Tesseract OCR引擎
的Java接口,可以用来识别图像中的文本,说白了,就是封装了它的API,让Java可以直接调用。搞清楚这俩东西,就足够了。
案例
1、引入依赖
既然是SpringBoot,基础依赖我就不赘述了,这里贴下Tess4J的依赖,是可以用maven下载的。
<!-- tess4j -->
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>4.5.4</version>
</dependency>
2、yml配置
这里,我特地把训练数据的目录路径配置在yml里,后续可以扩展到配置中心。
server:
port: 8888
# 训练数据文件夹的路径
tess4j:
datapath: D:/tessdata
然后我解释下什么是训练数据
Tesseract OCR库通过训练数据来学习不同语言和字体的特征,以便更好地识别图片中的文字。
在安装Tesseract OCR库时,通常会生成一个包含多个子文件夹的训练数据文件夹,其中每个子文件夹都包含了特定语言或字体的训练数据。
比如我这里是下载后放到了D盘的tessdata目录下,如图所示,其实就是一个
.traineddata
为后缀的文件,大小约2M多。
如果你没有特定的训练数据需求,使用默认的训练数据文件即可,我这里就是直接下载默认的来用的。
还有一点要注意的是,直接读resource目录下的路径是读不到的哈,所以我放到了D盘,训练数据本身也是更推荐放到独立的位置,方便后续训练数据。
3、config配置类
我们新建一个配置类,初始化一下Tesseract类,交给Spring管理,这样借用了Spring的单例模式。
package com.example.tesseractocr.config;
import net.sourceforge.tess4j.Tesseract;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @作者: 公众号【Java分享客栈】
* @日期: 2023/10/12 22:58
* @描述:
*/
@Configuration
public class TesseractOcrConfiguration {
@Value("${tess4j.datapath}")
private String dataPath;
@Bean
public Tesseract tesseract() {
Tesseract tesseract = new Tesseract();
// 设置训练数据文件夹路径
tesseract.setDatapath(dataPath);
// 设置为中文简体
tesseract.setLanguage("chi_sim");
return tesseract;
}
}
4、service实现
就几行代码,非常简单。
package com.example.tesseractocr.service;
import lombok.AllArgsConstructor;
import net.sourceforge.tess4j.*;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
@Service
@AllArgsConstructor
public class OcrService {
private final Tesseract tesseract;
/**
* 识别图片中的文字
* @param imageFile 图片文件
* @return 文字信息
*/
public String recognizeText(MultipartFile imageFile) throws TesseractException, IOException {
// 转换
InputStream sbs = new ByteArrayInputStream(imageFile.getBytes());
BufferedImage bufferedImage = ImageIO.read(sbs);
// 对图片进行文字识别
return tesseract.doOCR(bufferedImage);
}
}
5、新增rest接口
我们新建一个rest接口,用来测试效果,使用上传图片文件的方式。
package com.example.tesseractocr.controller;
import com.example.tesseractocr.service.OcrService;
import lombok.AllArgsConstructor;
import net.sourceforge.tess4j.TesseractException;
import org.springframework.http.MediaType;
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;
@RequestMapping("/api")
@RestController
@AllArgsConstructor
public class OcrController {
private final OcrService ocrService;
@PostMapping(value = "/recognize", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public String recognizeImage(@RequestParam("file") MultipartFile file) throws TesseractException, IOException {
// 调用OcrService中的方法进行文字识别
return ocrService.recognizeText(file);
}
}
6、测试效果
这里我用ApiPost工具来测试下最终效果
我准备的一张图片如下,是从知乎上随便截取的一张。
我们调接口试一下,这里要设置Header的Content-Type,别忘了哈。
这里是body中的参数,我们选择form-data中的File属性,表示以上传文件形式来调接口。
看下效果,其实还是挺不错的,我和图片比对了一下,基本上都识别出来了。
相关地址
1)、Tesseract-ocr官方Github地址:https://github.com/tesseract-ocr/tesseract
2)、Tesseract-ocr安装下载:https://digi.bib.uni-mannheim.de/tesseract/
PS:这里我没有用官方Github文档中给的地址,因为太慢了,找了一个下载比较快的,你们可以往下拉找到win64位的安装即可,如果没有训练需求,不用下也可以)
3)、训练文件:https://digi.bib.uni-mannheim.de/tesseract/tessdata_fast/
PS:在2)的路径下,有一个tessdata_fast目录,点进去就能直接下载到默认训练文件,这种比较简便,省去了前面安装下载的过程。
4)、案例代码:https://gitee.com/fangfuji/java-share
PS:代码放在Gitee上,在同名博文目录里面,包含代码+安装文件+训练文件。
总结
是不是非常简单xdm,反正我觉得挺有意思的,后面抽空再试试训练数据。
好了,今天的小知识,你学会了吗?
如果喜欢,请点赞+关注↓↓↓,持续分享干货哦!
Java也能做OCR!SpringBoot 整合 Tess4J 实现图片文字识别的更多相关文章
- 【图片识别】Java中使用tess4J进行图片文字识别(支持中文)(转)
http://blog.csdn.net/wsk1103/article/details/54173282 java中识别文字比较简单,使用的软件是tesseractocr(使用的版本是3.02,3以 ...
- springboot整合ueditor实现图片上传和文件上传功能
springboot整合ueditor实现图片上传和文件上传功能 写在前面: 在阅读本篇之前,请先按照我的这篇随笔完成对ueditor的前期配置工作: springboot+layui 整合百度富文本 ...
- 【图片识别】java 图片文字识别 ocr (转)
http://www.cnblogs.com/inkflower/p/6642264.html 最近在开发的时候需要识别图片中的一些文字,网上找了相关资料之后,发现google有一个离线的工具,以下为 ...
- springboot整合thumbnailator实现图片压缩
springboot整合thumbnailator实现图片压缩 前言 最近由于首页产品列表图片显示太慢,经过研究发现是用户上传的图片太大. 针对这个问题,想到的解决方案是: 1. 产品上传时,限定图片 ...
- java 图片文字识别 ocr
最近在开发的时候需要识别图片中的一些文字,网上找了相关资料之后,发现google有一个离线的工具,以下为java使用的demo 在此之前,使用这个工具需要在本地安装OCR工具: 下面一个是一定要安装的 ...
- 小试Office OneNote 2010的图片文字识别功能(OCR)
原文:小试Office OneNote 2010的图片文字识别功能(OCR) 自Office 2003以来,OneNote就成为了我电脑中必不可少的软件,它集各种创新功能于一身,可方便的记录下各种类型 ...
- [C13] 应用实例:图片文字识别(Application Example: Photo OCR)
应用实例:图片文字识别(Application Example: Photo OCR) 问题描述和流程图(Problem Description and Pipeline) 图像文字识别应用所作的事是 ...
- 一篇文章搞定百度OCR图片文字识别API
一篇文章搞定百度OCR图片文字识别API https://www.jianshu.com/p/7905d3b12104
- 【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 18—Photo OCR 应用实例:图片文字识别
Lecture 18—Photo OCR 应用实例:图片文字识别 18.1 问题描述和流程图 Problem Description and Pipeline 图像文字识别需要如下步骤: 1.文字侦测 ...
- JAVA的图片文字识别技术
从2013年的记录看,JAVA中图片文字识别技术大部分采用ORC的tesseract的软件功能,后来渐渐开放了java-api调用接口. 图片文字识别技术,还是采用训练的方法.并未从根本上解决图片与文 ...
随机推荐
- 盘古大模型加持,华为云开天aPaaS加速使能千行百业应用创新
摘要:开天aPaaS,让优秀快速复制,支撑开发者及伙伴上好云.用好云. 本文分享自华为云社区<盘古大模型加持,华为云开天aPaaS加速使能千行百业应用创新>,作者:开天aPaaS小助手. ...
- Code Generate V2.0 代码生成器
Code Generate 代码生成器 系统首页 使用说明 系统默认会根据SQL生成字段信息 className.fieldList.classComment 如下所示: 建表语句 CREATE TA ...
- 使用官方推荐的库来测react hook组件
最近写单元测试的时候遇见了一些问题,当我使用使用jest测React. useRef, React. useEffect时,总是测不到, 然后我去查阅了一下官方文档,它推荐了使用下面这个库 @tes ...
- JFrame一些基础小知识
JFrame.setLocationRelativeTo方法 JFrame.setLocationRelativeTo()是一个Java Swing中的方法,它用于将窗口居中显示在屏幕上. 当你调用该 ...
- React: 路由重定向
解决方案 参考链接 https://v5.reactrouter.com/web/example/route-config
- 这些年写过的花式sql - 第一句 删除重复无效的记录
这些年写过的花式sql - 第一句 删除重复无效的记录 写好复杂sql可以减少代码量,经过写这些年的后台统计,我学着像写代码一样的设计和尝试sql.现整理如下: 本来想一次性写完的,不过那写起来和看起 ...
- 从redis未授权访问到获取服务器权限
从redis未授权访问到获取服务器权限 好久没写博客了,博客园快荒芜了.赶紧再写一篇,算是一个关于自己学习的简要的记录把. 这里是关于redis未授权访问漏洞的一篇漏洞利用: 首先是redis,靶场搭 ...
- 11、Spring之基于注解的AOP
11.1.环境搭建 创建名为spring_aop_annotation的新module,过程参考9.1节 11.1.1.配置打包方式和依赖 注意:AOP需要在IOC的基础上实现,因此需要导入IOC的依 ...
- 浅谈 Linux 下 vim 的使用
Vim 是从 vi 发展出来的一个文本编辑器,其代码补全.编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用. Vi 是老式的字处理器,功能虽然已经很齐全了,但还有可以进步的地方.Vim 可 ...
- stencilJs学习之构建 Drawer 组件
前言 在之前的学习中,我们已经掌握了 stencilJs 中的一些核心概念和基础知识,如装饰器 Prop.State.Event.Listen.Method.Component 以及生命周期方法.这些 ...