• Java实现图片转文字!(OCR实现)


    今天给大家分享一个Java实现OCR(图片转文字)的方法。

    具体实现是把tess4j整合到一个SpringBoot项目中。

    下面是详细步骤

    什么是Tess4j

    在实现OCR之前,先要分清楚TesseractTess4j的区别。

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

    Tess4J是一个基于Tesseract OCR引擎的Java接口,可以用来识别图像中的文本,说白了,就是封装了它的API,让Java可以直接调用。

    Tesseract引擎的下载

    根据上面介绍的,Tess4j只是提供OCR的Java接口,真正OCR的Tesseract引擎。所以我们得先下载对应系统的Tesseract引擎(这里我以Windows版本为例)。

    下载地址【github.com/UB-Mannheim…

    Snipaste_2023-10-13_16-18-47.png

    下载完成之后选择安装路径,默认安装即可。

    中文文字训练集下载

    Tesseract引擎默认是无法识别中文的,只能识别数字或者英文。如果我们想实现中文的识别就得去下载对应的训练集。

    下载地址【github.com/tesseract-o…

    Snipaste_2023-10-15_21-47-38.png

    我们可以看到Tesseract提供了很多语言的训练集,这里我们选择简体中文chi_sim

    然后将训练集放到Tesseract引擎对应的目录下,如下所示,tessdata文件夹是专门用来放训练集的。

    Snipaste_2023-10-15_21-49-11.png

    到此为止,我们的环境准备工作已经完成了。

    实现OCR

    首先新建一个SpringBoot项目,由于是提供api接口,所以勾选spring web。

    Snipaste_2023-10-15_20-03-48.png

    Snipaste_2023-10-15_20-06-07.png

    添加Maven依赖

    Snipaste_2023-10-15_22-13-32.png

    1. <dependency>
    2. <groupId>net.sourceforge.tess4jgroupId>
    3. <artifactId>tess4jartifactId>
    4. <version>4.5.1version>
    5. dependency>

    service层的实现

    代码如下。

    ps:如果我们想实现多语言识别,只需要在设置原因的时候将语言类型拼接起来。

    Snipaste_2023-10-15_22-16-29.png

    1. @Service
    2. public class OcrService {
    3. private final ITesseract tesseract;
    4. public OcrService() {
    5. this.tesseract = new Tesseract();
    6. //训练集存放的目录
    7. this.tesseract.setDatapath("D:\tesseract\tessdata");
    8. }
    9. public String recognizeText(BufferedImage image) throws TesseractException {
    10. tesseract.setLanguage("chi_sim");
    11. //如果想要实现简体和繁体的识别,只需要将语言类型拼接起来
    12. //tesseract.setLanguage("chi_sim+chi_tra");
    13. return tesseract.doOCR(image);
    14. }

    controller层的实现

    接下来我们对外提供一个controller接口,接收参数为MultipartFile

    Snipaste_2023-10-15_22-20-21.png

    1. @RestController
    2. @RequestMapping("/api/ocr")
    3. public class OcrController {
    4. @Autowired
    5. private OcrService ocrService;
    6. @PostMapping("/recognize")
    7. public ResponseEntity recognizeText(@RequestParam("file") MultipartFile file) {
    8. try {
    9. String result = ocrService.recognizeText(ImageIO.read(file.getInputStream()));
    10. return ResponseEntity.ok(result);
    11. } catch (IOException | TesseractException e) {
    12. return ResponseEntity.badRequest().body("图片处理出错: " + e.getMessage());
    13. }
    14. }

    测试接口

    首先启动SpringBoot项目。

    Snipaste_2023-10-15_22-28-59.png

    这里用postman来做api测试,测试对下面图片中文字识别的准确率

    Snipaste_2023-10-15_21-51-33.png

    postman中headersbody设置如下,完成之后点击send,可以看出识别的速度还是非常快的,仅用时1秒多,准确率也很高。

    Snipaste_2023-10-15_21-52-25.png

    Snipaste_2023-10-15_21-53-26.png

    是不是很简单,Tessdata不仅能够识别这些标准文字,还能识别很多特殊的字体,甚至可以用自己的笔迹来生成一个训练集来专门识别自己写的字!

  • 相关阅读:
    Matlab 中@ 的用法
    DOM系列之触屏事件
    1. 使用STM32CubeMX建立STM32G030C8T6项目工程
    【Quarto】Markdown导出PPT
    2023-11 | 短视频批量下载/爬取某个用户的所有视频 | Python
    H3C交换机 万兆光模块可以插在千兆光口上使用吗?
    LLM - Make Causal Mask 构造因果关系掩码
    数据库管理-第171期 Oracle是用这种方式确保读一致的(20240418)
    mysql源码分析——InnoDB的磁盘结构之日志文件格式分析
    打破数据分析壁垒:SPSS复习必备(四)
  • 原文地址:https://blog.csdn.net/weixin_48890074/article/details/133857210