Java使用Tesseract-OCR实战教程

2025-02-25 05:50

本文主要是介绍Java使用Tesseract-OCR实战教程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Java使用Tesseract-OCR实战教程》本文介绍了如何在Java中使用Tesseract-OCR进行文本提取,包括Tesseract-OCR的安装、中文训练库的配置、依赖库的引入以及具体的代...

Java使用Tesseract-OCR

光学字符识别(OCR, Optical Character Recognition)技术可以将图像中的文本转换为可编辑的文本。

Tesseract是目前最为流行的开源OCR引擎之一,支持多种语言和高效的文本识别。

本文将详细介绍如何在Java中使用Tesseract-OCR进行文本提取,包括Tesseract-OCR的安装、中文训练库的配置、依赖库的引入以及具体的代码实现。通过这个过程,我们将演示如何从视频帧中提取文本。

Tesseract-OCR安装

首先,我http://www.chinasem.cn们需要在系统上安装Tesseract-OCR。可以通过以下链接下载适用于Windows的安装包:

下载Tesseract-OCR安装包

下载完成后,运行安装程序并选择安装目录,默认下一步安装即可。

配置中文训练库

为了使Tesseract能够识别中文,我们需要下载中文简体的训练库文件chi_sim.traineddata,并将其放置在Tesseract的tessdata目录下。

例如:

makefile
D:\Program Files\Tesseract-OCR\tessdata

可以从以下链接下载中文训练库:

下载中文训练库

更多训练库可以在Tesseract官方github仓库找到。

引入依赖

为了在Java中使用Tesseract,我们需要引入tess4j库。tess4j是一个Java的Tesseract API封装,可以方便地在Java项目中使用Tesseract。此外,为了处理视频帧,我们还需要javacv库。

以下是需要在Maven项目中引入的依赖:

```XML
<dependency>
    <groupId>net.sourceforge.tess4j</groupId>
    <artifactId>tess4j</artifactId>
    <version>5.3.0</version>
</dependency>
<!-- JavaCV: Java interface to OpenCV, FFmpeg, and more -->
<dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>javacv-platform</artifactId>
    <version>1.5.7</version>
</dependency>

代码实现

接下来,我们将实现一个Java类VideoTextExtractor,该类用于从视频中提取文本。

完整代码如下:

```java
import net.sourceforge.tess4j.TesseractException;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameUtils;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.Set;

public class VideoTextExtractor {
    // Tesseract-OCR安装路径
    public static final String pathToTessdataFolder = "D:\\Program Files\\Tesseract-OCR\\tessdata\\";
    // 加载视频
    public static final String pathToVideoFile = "C:\\Users\\lixiewen\\Documents\\oCam\\录制_2023_05_31_09_39_51_172.mp4";
    // 解析结果
   python public static final String resultFile = "E:\\tmp\\tmp.txt";

    public static void main(String[] args) throws TesseractException {
        extracted();
    }

    private static void extracted() {
        // 设置Tesseract OCR库的路径
        File tessDataFolder = new File(pathToTessdataFolder);
        System.setProperty("TESSDATA_PREFIX", tessDataFolder.getAbsolutePath());
        FFmpegFrameGrabbChina编程er grabber = new FFmpegFrameGrabber(pathToVideoFile);
        try {
            grabber.start();
            Set<String> set = new LinkedHashSet<>();
            // 遍历视频帧
            int lengthInFrames = grabber.getLengthInFrames();
            for (int i = 0; i < lengthInFrames; i++) {
                System.out.println("进度 " + i + " / " + lengthInFrames);
                try {
                    Frame frame = grabber.grabImage();
                    if (frame == null) continue;
                    BufferedImage bufferedImage = Java2DFrameUtils.toBufferedImage(frame);

                    // 将帧转换为灰度图像
                    BufferedImage grayImage = new BufferedImage(bufferedImage.getWidth(), bufferedImage.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
                    Graphics2D graphics = grayImage.createGraphics();
                    graphics.drawImage(bufferedImage, 0, 0, null);
                    graphics.dispose();

                    // 创建临时文件保存图像
                    File tempImageFile = File.createTempFile("frame", ".png");
                    ImageIO.write(grayImage, "png", tempImageFile);

                    Tesseract tesseract = getTesseract(tessDataFolder);
                    String result = tesseract.doOCR(tempImageFile);
                    set.add(result);
                    // 删除临时文件
                    tempImageFile.delete();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            File file = new File(resultFile);

            FileUtils.write2File(file, new ArrayList<>(set));

            grabber.stop();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static Tesseract getTesserachttp://www.chinasem.cnt(File tessDataFolder) {
        // 使用Tesseract OCR进行文字识别
        Tesseract tesseract = new Tesseract();
        // 设置中文训练库
        tesseract.setLanguage("chi_sim");
        tesseract.setDatapath(tessDataFolder.getAbsolutePath());
        return tesseract;
    }
}

免安装方式

如果不希望安装Tesseract-OCR,可以直接在项目中引入训练库。这种方式适合希望更方便地管理依赖的开发者。

  1. 引入Maven依赖
  2. 在代码中引入训练库
```java
import net.sourceforge.tess4j.Tesseract;

public class OCRUtil {
    public static ITesseract getTesseract() throws Exception {
        // 使用 Tesseract 识别文本
        ITesseract tesseract = new Tesseract();
        // 设置训练数据文件夹路径
        tesseract.setDatapath("src/main/resources/traineddata");
        // 设置为中文简体
        tesseract.setLanguage("chi_sim");
        return tesseracMAKWWUet;
    }
}

优化与提升

在实际应用中,我们可以对视频帧的处理和OCR识别进行优化,以提高识别效率和准确性。以下是一些建议:

  1. 图像预处理:在进行OCR识别之前,可以对图像进行去噪、二值化、旋转校正等预处理,以提高识别率。
  2. 多线程处理:对于长时间的视频处理,可以使用多线程来提高帧处理速度。
  3. 自定义训练数据:如果默认的训练数据效果不理想,可以通过Tesseract的训练工具自定义训练数据,以提高特定场景下的识别准确率。
  4. 结果后处理:OCR识别的文本可能包含一些噪声字符,可以通过正则表达式等方法对结果进行清洗和校正。

以下是一个优化后的图像预处理示例:

```java
    // 转换为灰度图像
    BufferedImage grayImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
    Graphics2D graphics = grayImage.createGraphics();
    graphics.drawImage(image, 0, 0, null);
    graphics.dispose();

    // 二值化处理
    for (int y = 0; y < grayImage.getHeight(); y++) {
        for (int x = 0; x < grayImage.getWidth(); x++) {
            int rgb = grayImage.getRGB(x, y);
            int gray = (rgb & 0xff);
            gray = gray > 128 ? 255 : 0;
            grayImage.setRGB(x, y, (gray << 16) | (gray << 8) | gray);
        }
    }
    return grayImage;
}

总结

通过本文的介绍,我们详细讲解了如何在Java中使用Tesseract-OCR进行文本提取的全过程。包括Tesseract-OCR的安装、中文训练库的配置、依赖库的引入以及具体的代码实现,并提供了一些优化建议。

这些内容能帮助您在实际项目中更好地应用Tesseract-OCR进行文本识别。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持China编程(www.chinasem.cn)。

这篇关于Java使用Tesseract-OCR实战教程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153530

相关文章

Python列表去重的4种核心方法与实战指南详解

《Python列表去重的4种核心方法与实战指南详解》在Python开发中,处理列表数据时经常需要去除重复元素,本文将详细介绍4种最实用的列表去重方法,有需要的小伙伴可以根据自己的需要进行选择... 目录方法1:集合(set)去重法(最快速)方法2:顺序遍历法(保持顺序)方法3:副本删除法(原地修改)方法4:

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

使用Python构建一个Hexo博客发布工具

《使用Python构建一个Hexo博客发布工具》虽然Hexo的命令行工具非常强大,但对于日常的博客撰写和发布过程,我总觉得缺少一个直观的图形界面来简化操作,下面我们就来看看如何使用Python构建一个... 目录引言Hexo博客系统简介设计需求技术选择代码实现主框架界面设计核心功能实现1. 发布文章2. 加

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

SpringBoot集成Milvus实现数据增删改查功能

《SpringBoot集成Milvus实现数据增删改查功能》milvus支持的语言比较多,支持python,Java,Go,node等开发语言,本文主要介绍如何使用Java语言,采用springboo... 目录1、Milvus基本概念2、添加maven依赖3、配置yml文件4、创建MilvusClient

浅析Java中如何优雅地处理null值

《浅析Java中如何优雅地处理null值》这篇文章主要为大家详细介绍了如何结合Lambda表达式和Optional,让Java更优雅地处理null值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录场景 1:不为 null 则执行场景 2:不为 null 则返回,为 null 则返回特定值或抛出异常场景

SpringMVC获取请求参数的方法

《SpringMVC获取请求参数的方法》:本文主要介绍SpringMVC获取请求参数的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... 目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F