前言

今天给大家分享一个SpringBoot整合Tess4j库实现图片文字识别的小案例,希望xdm喜欢。

文末有案例代码的Git地址,可以自己下载了去玩玩儿或继续扩展也行。

话不多说,开整吧。

什么是Tess4j库

先简单给没听过的xdm解释下,这里要分清楚TesseractTess4j的区别。

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 实现图片文字识别的更多相关文章

  1. 【图片识别】Java中使用tess4J进行图片文字识别(支持中文)(转)

    http://blog.csdn.net/wsk1103/article/details/54173282 java中识别文字比较简单,使用的软件是tesseractocr(使用的版本是3.02,3以 ...

  2. springboot整合ueditor实现图片上传和文件上传功能

    springboot整合ueditor实现图片上传和文件上传功能 写在前面: 在阅读本篇之前,请先按照我的这篇随笔完成对ueditor的前期配置工作: springboot+layui 整合百度富文本 ...

  3. 【图片识别】java 图片文字识别 ocr (转)

    http://www.cnblogs.com/inkflower/p/6642264.html 最近在开发的时候需要识别图片中的一些文字,网上找了相关资料之后,发现google有一个离线的工具,以下为 ...

  4. springboot整合thumbnailator实现图片压缩

    springboot整合thumbnailator实现图片压缩 前言 最近由于首页产品列表图片显示太慢,经过研究发现是用户上传的图片太大. 针对这个问题,想到的解决方案是: 1. 产品上传时,限定图片 ...

  5. java 图片文字识别 ocr

    最近在开发的时候需要识别图片中的一些文字,网上找了相关资料之后,发现google有一个离线的工具,以下为java使用的demo 在此之前,使用这个工具需要在本地安装OCR工具: 下面一个是一定要安装的 ...

  6. 小试Office OneNote 2010的图片文字识别功能(OCR)

    原文:小试Office OneNote 2010的图片文字识别功能(OCR) 自Office 2003以来,OneNote就成为了我电脑中必不可少的软件,它集各种创新功能于一身,可方便的记录下各种类型 ...

  7. [C13] 应用实例:图片文字识别(Application Example: Photo OCR)

    应用实例:图片文字识别(Application Example: Photo OCR) 问题描述和流程图(Problem Description and Pipeline) 图像文字识别应用所作的事是 ...

  8. 一篇文章搞定百度OCR图片文字识别API

    一篇文章搞定百度OCR图片文字识别API https://www.jianshu.com/p/7905d3b12104

  9. 【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 18—Photo OCR 应用实例:图片文字识别

    Lecture 18—Photo OCR 应用实例:图片文字识别 18.1 问题描述和流程图 Problem Description and Pipeline 图像文字识别需要如下步骤: 1.文字侦测 ...

  10. JAVA的图片文字识别技术

    从2013年的记录看,JAVA中图片文字识别技术大部分采用ORC的tesseract的软件功能,后来渐渐开放了java-api调用接口. 图片文字识别技术,还是采用训练的方法.并未从根本上解决图片与文 ...

随机推荐

  1. IcedID恶意文档钓鱼手法剖析

    析 利用oletools静态分析,提取宏代码,如图: Function contents() With ActiveDocument.Content.Find loveDoor = .Execute( ...

  2. 「学习笔记」vector

    本文并不是 vector 的入门教程. 定义 std::vector 是封装动态数组的顺序容器. vector 通常占用多于静态数组的空间,因为要分配更多内存以管理将来的增长.如果元素数量已知,可以使 ...

  3. uniapp微信小程序转支付宝小程序踩坑(持续更新)

    首先第一个,真有被折磨到! // 微信正常使用,支付宝不行 <image src="https://static.dabapiao.com/images/coupon-index.pn ...

  4. 全球权威的 IT 研究公司 Gartner,发布未来五大隐私趋势

    Gartner(高德纳) 公司是全球最具权威的 IT 研究与顾问咨询公司之一,它成立于 1979 年,总部设在美国康涅狄克州斯坦福.其研究范围覆盖全部 IT 产业,包括 IT 的研究.发展.评估.应用 ...

  5. ElasticSearch - 批量更新bulk死锁问题排查

    一.问题系统介绍 监听商品变更MQ消息,查询商品最新的信息,调用BulkProcessor批量更新ES集群中的商品字段信息; 由于商品数据非常多,所以将商品数据存储到ES集群上,整个ES集群共划分了2 ...

  6. TCP/IP网络体系结构中,各层的作用,以及各层协议的作用。

    1.[TCP/IP]协议中每层的作用 从协议分层模型方面来讲,TCP/IP由四个层次组成:数据链路层(网络接口层).网络层.传输层.应用层 TCP/IP网络体系结构中,各层作用: 1.网络接口层:负责 ...

  7. 【技术积累】Vue.js中的事件【一】

    Vue中的事件是什么 在Vue.js中,事件是用于处理用户交互的重要机制.Vue.js提供了一系列的事件处理方法和指令,使开发者能够方便地处理用户的各种操作. 1. 事件绑定:Vue.js通过v-on ...

  8. Linux 安装:中文manpages

    Linux 中文man手册安装 bash 脚本 wget https://src.fedoraproject.org/repo/pkgs/man-pages-zh-CN/manpages-zh-1.5 ...

  9. Llama2 论文中译版——开放式基础和微调聊天模型

    Llama 2:开放式基础和微调聊天模型 写在前头 因为最近一直在使用 LLM 工具,所以在学习 Llama 2:开放式基础和微调聊天模型 这篇论文的期间,顺手将内容翻译了过来. 整片译文是由 Cha ...

  10. Flutter系列文章-Flutter进阶2

    这一节我将再详细地为您介绍 Flutter 进阶主题,包括导航和路由.状态管理.异步处理.HTTP请求和Rest API,以及数据持久化.让我们逐个介绍这些主题. 1.导航和路由 在 Flutter ...