验证码自动识别:使用 Java 和 Tesseract OCR 实现

验证码(CAPTCHA)用于防止机器人自动提交数据,但在自动化测试、数据采集等场景中,我们可能需要自动识别验证码。本文将介绍如何使用 Java 结合 Tesseract OCR 解析验证码,并优化识别准确度。

  1. 环境准备

在开始编写代码之前,我们需要安装 Java 和 Tesseract OCR。
更多内容访问ttocr.com或联系1436423940
1.1 安装 Java

如果尚未安装 Java,可以前往 Oracle 官网
或 AdoptOpenJDK
下载并安装最新版本。

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

java -version

1.2 安装 Tesseract OCR
Windows 用户

从 Tesseract OCR 官方 GitHub
下载 Windows 版本并安装。

配置环境变量,在 PATH 中添加 Tesseract 的安装路径,例如:C:\Program Files\Tesseract-OCR\。

Linux/macOS 用户

Ubuntu

sudo apt update && sudo apt install tesseract-ocr

macOS (使用 Homebrew)

brew install tesseract

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

tesseract --version

1.3 添加 Java 依赖库

在 Java 中使用 Tesseract OCR,需要使用 Tess4J 库。

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

net.sourceforge.tess4j tess4j 4.5.5

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

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

  1. 代码实现

下面的 Java 代码示例展示了如何 加载验证码图像、进行预处理,并使用 Tesseract 进行 OCR 解析。

2.1 代码示例
import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;

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

public class CaptchaRecognizer {

public static void main(String[] args) {
    // 指定验证码图片路径
    String imagePath = "captcha.png";  // 替换为你的验证码图片路径
    String result = recognizeCaptcha(imagePath);
    System.out.println("识别出的验证码: " + result);
}

public static String recognizeCaptcha(String imagePath) {
    try {
        // 读取图像
        BufferedImage img = ImageIO.read(new File(imagePath));

        // 预处理图像(灰度化 + 二值化)
        BufferedImage processedImg = preprocessImage(img);

        // 初始化 Tesseract OCR
        ITesseract tesseract = new Tesseract();
        tesseract.setDatapath("tessdata");  // 指定 Tesseract 语言数据目录
        tesseract.setLanguage("eng");  // 选择英文 OCR 模型
        tesseract.setTessVariable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"); // 限制识别字符
        tesseract.setPageSegMode(6); // 适用于单行文本

        // 识别文本
        return tesseract.doOCR(processedImg).trim();

    } catch (IOException | TesseractException e) {
        e.printStackTrace();
        return null;
    }
}

private static BufferedImage preprocessImage(BufferedImage img) {
    int width = img.getWidth();
    int height = img.getHeight();

    BufferedImage grayImg = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_BINARY);

    // 遍历每个像素,进行灰度化 + 二值化
    for (int x = 0; x < width; x++) {
        for (int y = 0; y < height; y++) {
            int rgb = img.getRGB(x, y);
            int gray = (rgb >> 16) & 0xff; // 取 R 通道作为灰度值
            if (gray > 128) {
                grayImg.setRGB(x, y, 0xFFFFFF); // 白色
            } else {
                grayImg.setRGB(x, y, 0x000000); // 黑色
            }
        }
    }
    return grayImg;
}

}

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

为了提高 OCR 识别率,我们对验证码图像进行了以下优化处理:

灰度化:提取验证码的亮度信息,去除颜色干扰。

二值化:将像素转换为黑白,使字符更加清晰可见。

Java 没有 OpenCV 这样强大的图像处理库,所以我们手动遍历像素进行灰度转换和二值化处理。

3.2 OCR 解析

Tesseract() 初始化 OCR 引擎。

setLanguage("eng") 设置 OCR 语言,默认使用 eng(英语)。

setTessVariable("tessedit_char_whitelist", "...") 限制可识别字符,避免误识别。

setPageSegMode(6) 使用 PSM 6 进行单行文本识别。

doOCR() 执行 OCR 解析,返回识别出的文本。

  1. 运行程序

将代码保存为 CaptchaRecognizer.java,并确保 captcha.png 在同一目录下,然后编译运行:

javac -cp ".;tess4j-4.5.5.jar" CaptchaRecognizer.java
java -cp ".;tess4j-4.5.5.jar" CaptchaRecognizer

程序会加载验证码图像,进行处理并输出识别结果。

  1. 提高验证码识别准确率
    5.1 选择合适的 PSM 模式

Tesseract 提供了不同的 页面分割模式(PSM),验证码通常使用 PSM 6 或 7:

tesseract.setPageSegMode(6); // 适用于单行文本

5.2 进一步图像优化

去除噪点:可以使用 OpenCV 或 Java Image Processing(JIP)进行噪声滤波。

字符分割:如果验证码字符粘连,可以尝试 轮廓检测 或 投影分割算法 提高单字符识别率。

5.3 采用深度学习 OCR 方案

如果 Tesseract 不能满足需求,可以考虑使用 深度学习 OCR,如:

EasyOCR(Python)

PaddleOCR(Python)

Google Vision API(云端 OCR)

posted @ 2025-09-07 19:26  ttocr、com  阅读(9)  评论(0)    收藏  举报