切换语言为:繁体
基于 Java 轻松实现OCR功能

基于 Java 轻松实现OCR功能

  • 爱糖宝
  • 2024-08-30
  • 2055
  • 0
  • 0

一、引言

你是否曾遇到过这样的情况:看到一段有用的文本,想要快速复制下来,却只能眼巴巴地盯着屏幕,手动输入?其实,Java 也可以轻松实现 OCR(光学字符识别)功能,让你轻松识别并提取图片中的文字信息。不需要庞大的外部工具,也不必担心复杂的配置,只需几行代码,Java 就能帮你搞定 OCR!接下来,我们将带你一步步揭开这项技术的神秘面纱,让你的 Java 项目更加智能、便捷。

二、功能演示

先让我们看看最终效果,再进行实现

基于 Java 轻松实现OCR功能

三、功能实现

1. 描述

在这部分,我们将使用 SpringBoot 和 Tess4j 来实现 OCR 功能。Tess4j 是一个基于 Tesseract 的 Java 封装库,它让我们能够轻松地在 Java 应用中使用 OCR 技术。无论你是在处理扫描的文档、识别图片中的文字,还是自动化读取截图内容,Tess4j 都能派上用场。通过与 SpringBoot 结合,我们可以快速搭建一个轻量级的 RESTful 服务,轻松应对各种 OCR 需求。

2. 编码实现

2.1 引入依赖
<dependency>
    <groupId>net.sourceforge.tess4j</groupId>
    <artifactId>tess4j</artifactId>
</dependency>


2.2 初始化Tesseract引擎

注意事项 :

  • 项目部署:

    • 使用 new ClassPathResource("tess_data").getFile().getAbsolutePath() 可能在项目打成 Jar 包后无法正常访问。为了解决这个问题,可以参考一些开源项目中的 TensorflowUtil 工具类,将 resource 文件进行转存后再加载。

    • 在 Linux 环境中,还需要解决 无法初始化 net.sourceforge.tess4j.TessAPI 的问题,确保所有必要的依赖库和系统配置正确。

  • 训练数据:

    • tessdata_best: 主要针对高精度要求的应用场景,虽然识别速度较慢,但结果更准确。

    • tessdata: 是标准的训练数据集,平衡了识别速度和精度,适合一般的 OCR 应用。

    • tessdata_fast: 适用于需要快速识别的场景,虽然精度略低,但可以显著提升识别速度。

    • 不同的训练数据和配置会影响识别结果的精度和速度。可以根据实际需求自行训练适合的数据集。

    • 免费的训练数据包括:

/**
 * TesseractOcr 模型加载
 *
 * @author : YiFei
 */
@Slf4j
@Getter
@Component
public class TesseractOcrModelService {

    private final Tesseract tesseract = new Tesseract();

    public TesseractOcrModelService() {
        try {
            // 获取训练模型文件夹 (该方法在打包为jar后会有问题,建议使用项目中TensorflowUtil工具类)
            String folderPath = new ClassPathResource("tess_data").getFile().getAbsolutePath();
            /*
             * OEM_TESSERACT_ONLY = 0:表示仅运行Tesseract OCR引擎,不使用LSTM(Long Short-Term Memory)线识别器。Tesseract是一种传统的OCR引擎,适用于一般的文字识别任务。
             * OEM_LSTM_ONLY = 1:表示仅运行LSTM线识别器,不使用Tesseract。LSTM是一种深度学习模型,通常在处理复杂文本或手写文字识别等任务时表现较好。
             * OEM_TESSERACT_LSTM_COMBINED = 2:表示同时运行Tesseract和LSTM识别器,并在遇到困难情况时允许回退到Tesseract。这种组合模式可以在不同情况下灵活地选择最适合的识别引擎。
             * OEM_DEFAULT = 3:当调用 init_*() 方法时指定此模式,表示可以根据语言特定配置、命令行配置等自动推断使用哪种模式。如果没有明确指定,则默认使用 OEM_TESSERACT_ONLY 模式。
             */
            tesseract.setPageSegMode(OEM_TESSERACT_LSTM_COMBINED);
            // 设置Tesseract OCR引擎的训练数据文件夹路径
            /*
             * chi_sim.traineddata: Chinese Simplified(中文简体)
             * chi_sim_vert.traineddata: Chinese Simplified Vertical(中文简体竖排)
             * chi_tra.traineddata: Chinese Traditional(中文繁体)
             * chi_tra_vert.traineddata: Chinese Traditional Vertical(中文繁体竖排)
             */
            tesseract.setDatapath(folderPath);
            tesseract.setPageSegMode(6);
            // 设置为中文简体
            tesseract.setLanguage("chi_sim");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

}


2.3 编写 RESTful 接口

/**
 * Ocr-控制器
 *
 * @author : YiFei
 */
@RestController
@RequestMapping("ocr")
@RequiredArgsConstructor
public class OcrController {

    private final TesseractOcrModelService tesseractOcrModelService;

    @PostMapping("/detection")
    public Result<String> ocrDetection(MultipartFile file) {
        try {
            /*
            图片调整推荐 :
                二值化:将图像转换为黑白,有助于提高对比度。
                去噪:去除图像中的噪声。
                旋转矫正:确保图像中的文本是水平的。
             */
            Tesseract tesseract = tesseractOcrModelService.getTesseract();
            return Result.success(tesseract.doOCR(ImageIO.read(file.getInputStream())));
        } catch (Exception e) {
            throw new RuntimeException("ImageIO.read(file.getInputStream())) 解析错误");
        }
    }
}

0条评论

您的电子邮件等信息不会被公开,以下所有项均必填

OK! You can skip this field.