当前位置: 代码网 > it编程>编程语言>Java > Java使用Tesseract-OCR实战教程

Java使用Tesseract-OCR实战教程

2025年02月24日 Java 我要评论
java使用tesseract-ocr光学字符识别(ocr, optical character recognition)技术可以将图像中的文本转换为可编辑的文本。tesseract是目前最为流行的开

java使用tesseract-ocr

光学字符识别(ocr, optical character recognition)技术可以将图像中的文本转换为可编辑的文本。

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

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

tesseract-ocr安装

首先,我们需要在系统上安装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";
    // 解析结果
    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());
        ffmpegframegrabber 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 gettesseract(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 tesseract;
    }
}

优化与提升

在实际应用中,我们可以对视频帧的处理和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进行文本识别。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com