使用 Java 解析验证码:结合 Tesseract OCR 进行文本识别

更多内容访问ttocr.com或联系1436423940

  1. 环境准备
    1.1 安装 Java

如果尚未安装 Java,可前往 Oracle 官方网站
或 Adoptium
下载最新版本的 JDK。安装完成后,运行以下命令检查版本:

java -version

1.2 安装 Tesseract OCR
Windows

从 Tesseract GitHub
下载并安装。安装完成后,记得将 tesseract.exe 目录添加到环境变量。

Linux(Ubuntu)
sudo apt update
sudo apt install tesseract-ocr libtesseract-dev

macOS(Homebrew)
brew install tesseract

安装完成后,检查 Tesseract 是否安装成功:

tesseract --version

1.3 添加 Tesseract Java 库

在 Java 代码中使用 Tesseract OCR,我们需要使用 Tess4J,它是 Tesseract 的 Java 封装库。

如果使用 Maven,请在 pom.xml 中添加以下依赖:

net.sourceforge.tess4j tess4j 4.5.5

如果使用 Gradle,请在 build.gradle 中添加:

dependencies {
implementation 'net.sourceforge.tess4j:tess4j:4.5.5'
}

  1. Java 代码实现

创建 CaptchaReader.java,写入以下代码:

import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class CaptchaReader {

public static void main(String[] args) {
    String imagePath = "captcha.png"; // 替换为你的验证码图片路径

    // 预处理验证码
    String processedImagePath = "processed_captcha.png";
    preprocessImage(imagePath, processedImagePath);

    // 使用 Tesseract 进行 OCR 识别
    ITesseract tesseract = new Tesseract();
    tesseract.setDatapath("tessdata"); // Tesseract 语言数据路径
    tesseract.setLanguage("eng"); // 设置语言

    try {
        String result = tesseract.doOCR(new File(processedImagePath));
        System.out.println("识别出的验证码: " + result.trim());
    } catch (TesseractException e) {
        System.err.println("OCR 识别失败: " + e.getMessage());
    }
}

/**
 * 预处理验证码图像,提高 OCR 识别率
 */
public static void preprocessImage(String inputPath, String outputPath) {
    try {
        BufferedImage image = ImageIO.read(new File(inputPath));

        // 转换为灰度图像
        BufferedImage grayImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
        Graphics g = grayImage.getGraphics();
        g.drawImage(image, 0, 0, null);
        g.dispose();

        // 二值化处理
        for (int x = 0; x < grayImage.getWidth(); x++) {
            for (int y = 0; y < grayImage.getHeight(); y++) {
                int rgb = grayImage.getRGB(x, y);
                int gray = (rgb >> 16) & 0xFF;
                grayImage.setRGB(x, y, (gray > 128) ? Color.WHITE.getRGB() : Color.BLACK.getRGB());
            }
        }

        // 保存处理后的图片
        ImageIO.write(grayImage, "png", new File(outputPath));
    } catch (IOException e) {
        System.err.println("图像处理失败: " + e.getMessage());
    }
}

}

  1. 代码解析
    3.1 图像预处理

为了提高 OCR 识别率,代码对验证码进行以下优化:

转换为灰度图像,去除颜色干扰:

BufferedImage grayImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_BYTE_GRAY);

二值化处理,增强对比度:

int gray = (rgb >> 16) & 0xFF;
grayImage.setRGB(x, y, (gray > 128) ? Color.WHITE.getRGB() : Color.BLACK.getRGB());

保存处理后的图片,方便后续 OCR 识别:

ImageIO.write(grayImage, "png", new File(outputPath));

3.2 OCR 识别

创建 Tesseract 实例

ITesseract tesseract = new Tesseract();

设置 OCR 语言

tesseract.setLanguage("eng");

执行 OCR 解析

String result = tesseract.doOCR(new File(processedImagePath));

  1. 运行程序

确保 captcha.png 放在程序目录下,然后运行:

javac -cp .:tess4j.jar CaptchaReader.java
java -cp .:tess4j.jar CaptchaReader

如果使用 Maven,则运行:

mvn compile exec:java -Dexec.mainClass="CaptchaReader"

示例输出:

识别出的验证码: X7G9H

  1. 提高 OCR 识别率
    5.1 选择不同的 Tesseract PSM 模式
    tesseract.setPageSegMode(6); // 单行文本模式

5.2 限制识别字符集
tesseract.setTessVariable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");

5.3 使用更强的验证码处理

如果验证码干扰较多,可以使用 OpenCV 进行形态学处理,例如去除噪点、字符分割等。

posted @ 2025-10-29 23:29  ttocr、com  阅读(8)  评论(0)    收藏  举报