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

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

bash

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

Linux(Ubuntu)
bash

sudo apt update
sudo apt install tesseract-ocr libtesseract-dev
macOS(Homebrew)
bash

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

bash

tesseract --version
1.3 添加 Tesseract Java 库
在 Java 代码中使用 Tesseract OCR,我们需要使用 Tess4J,它是 Tesseract 的 Java 封装库。

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

xml

net.sourceforge.tess4j tess4j 4.5.5 如果使用 Gradle,请在 build.gradle 中添加:

gradle

dependencies {
implementation 'net.sourceforge.tess4j:tess4j:4.5.5'
}
2. Java 代码实现
创建 CaptchaReader.java,写入以下代码:

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());
    }
}

}
3. 代码解析
3.1 图像预处理
为了提高 OCR 识别率,代码对验证码进行以下优化:

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

BufferedImage grayImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
二值化处理,增强对比度:
java

int gray = (rgb >> 16) & 0xFF;
grayImage.setRGB(x, y, (gray > 128) ? Color.WHITE.getRGB() : Color.BLACK.getRGB());
保存处理后的图片,方便后续 OCR 识别:
java

ImageIO.write(grayImage, "png", new File(outputPath));
3.2 OCR 识别
创建 Tesseract 实例
java

ITesseract tesseract = new Tesseract();
设置 OCR 语言
java

tesseract.setLanguage("eng");
执行 OCR 解析
java

String result = tesseract.doOCR(new File(processedImagePath));
4. 运行程序
确保 captcha.png 放在程序目录下,然后运行:

bash

javac -cp .:tess4j.jar CaptchaReader.java
java -cp .:tess4j.jar CaptchaReader
如果使用 Maven,则运行:

bash

mvn compile exec:java -Dexec.mainClass="CaptchaReader"
示例输出:

makefile

识别出的验证码: X7G9H
5. 提高 OCR 识别率
5.1 选择不同的 Tesseract PSM 模式
java

tesseract.setPageSegMode(6); // 单行文本模式
5.2 限制识别字符集
java
更多内容访问ttocr.com或联系1436423940
tesseract.setTessVariable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
5.3 使用更强的验证码处理
如果验证码干扰较多,可以使用 OpenCV 进行形态学处理,例如去除噪点、字符分割等。

posted @ 2025-03-17 20:49  ttocr、com  阅读(127)  评论(0)    收藏  举报