Java 和 Tesseract 实现验证码识别

验证码(CAPTCHA)是广泛应用于各种网站和平台的验证工具,用于区分人类用户与自动化脚本或机器人。为了提高用户体验或自动化流程,有时我们需要通过编程来识别和处理验证码。本文将展示如何使用 Java 编程语言结合 Tesseract OCR 引擎实现验证码的自动识别。

  1. 环境准备
    安装 Tesseract OCR 引擎
    首先,我们需要安装 Tesseract OCR 引擎。Tesseract 是一个开源的 OCR 引擎,支持多种语言的文字识别。

Windows:你可以从 Tesseract 官方 GitHub 下载适用于 Windows 的安装包。安装时请注意将 Tesseract 添加到系统环境变量中。
Linux:在 Linux 上,使用以下命令安装:
bash
更多内容访问ttocr.com或联系1436423940
sudo apt-get install tesseract-ocr
macOS:使用 Homebrew 安装:
bash

brew install tesseract
安装完成后,可以通过命令行检查 Tesseract 是否安装成功:

bash

tesseract --version
安装 Java 和相关依赖
确保你已经安装了 Java Development Kit (JDK)。你可以从 Oracle 官网 或 AdoptOpenJDK 下载并安装 JDK。

接下来,使用 Maven 来管理 Java 项目的依赖,Tesseract 的 Java 库 Tesseract4J 可以通过 Maven 安装。在项目的 pom.xml 文件中添加以下依赖:

xml

net.sourceforge.tess4j tess4j 4.5.5 org.apache.commons commons-io 2.8.0 2. 编写验证码识别代码 下面是一个简单的 Java 程序,它利用 Tesseract 进行验证码的识别。我们将图像加载并传递给 Tesseract 引擎,最后输出识别的结果。

java

import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.util.ImageHelper;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;

public class CaptchaRecognition {
public static void main(String[] args) {
// 设置 Tesseract 数据文件的路径
String tessDataPath = "C:/Program Files/Tesseract-OCR/tessdata"; // 根据实际安装路径修改

    // 创建 Tesseract 实例
    ITesseract instance = new Tesseract();
    instance.setDatapath(tessDataPath); // 设置 Tesseract 数据路径
    instance.setLanguage("eng"); // 设置语言为英文

    try {
        // 读取验证码图像
        File captchaImage = new File("captcha.png");
        BufferedImage image = ImageIO.read(captchaImage);

        // 执行 OCR 识别
        String result = instance.doOCR(image);

        // 输出识别结果
        System.out.println("识别的验证码是: " + result.trim());
    } catch (Exception e) {
        System.err.println(e.getMessage());
    }
}

}
代码说明:
Tesseract 数据路径:通过 instance.setDatapath 设置 Tesseract 数据文件的路径。tessdata 文件夹中包含了 Tesseract 所需的语言文件。
图像读取:通过 ImageIO.read 读取图像文件(例如 captcha.png)。
OCR 识别:使用 instance.doOCR(image) 执行 OCR 识别,返回识别的文本。
输出结果:识别的文本会被输出到控制台。
3. 图像预处理
为了提高验证码识别的准确性,我们可以对图像进行一些预处理。常见的预处理操作包括灰度化、二值化、去噪等。下面是一个示例,展示如何对验证码图像进行灰度化和二值化处理。

java

import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.util.ImageHelper;
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;

public class CaptchaRecognition {
public static void main(String[] args) {
// 设置 Tesseract 数据文件的路径
String tessDataPath = "C:/Program Files/Tesseract-OCR/tessdata"; // 根据实际安装路径修改

    // 创建 Tesseract 实例
    ITesseract instance = new Tesseract();
    instance.setDatapath(tessDataPath); // 设置 Tesseract 数据路径
    instance.setLanguage("eng"); // 设置语言为英文

    try {
        // 读取验证码图像
        File captchaImage = new File("captcha.png");
        BufferedImage image = ImageIO.read(captchaImage);

        // 图像预处理: 灰度化
        BufferedImage grayImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
        grayImage.getGraphics().drawImage(image, 0, 0, null);

        // 图像预处理: 二值化
        BufferedImage binarizedImage = new BufferedImage(grayImage.getWidth(), grayImage.getHeight(), BufferedImage.TYPE_BYTE_BINARY);
        for (int x = 0; x < grayImage.getWidth(); x++) {
            for (int y = 0; y < grayImage.getHeight(); y++) {
                Color c = new Color(grayImage.getRGB(x, y));
                int grayValue = (c.getRed() + c.getGreen() + c.getBlue()) / 3;
                if (grayValue < 128) {
                    binarizedImage.setRGB(x, y, Color.BLACK.getRGB());
                } else {
                    binarizedImage.setRGB(x, y, Color.WHITE.getRGB());
                }
            }
        }

        // 执行 OCR 识别
        String result = instance.doOCR(binarizedImage);

        // 输出识别结果
        System.out.println("识别的验证码是: " + result.trim());
    } catch (Exception e) {
        System.err.println(e.getMessage());
    }
}

}
代码说明:
灰度化:通过 BufferedImage.TYPE_BYTE_GRAY 创建一个灰度图像,并使用 getGraphics().drawImage() 方法将原图像绘制到灰度图像上。
二值化:通过遍历灰度图像的每个像素,根据其灰度值与阈值(128)进行比较,将其转换为黑色或白色。
4. 提高识别准确率
虽然 Tesseract 是一个功能强大的 OCR 引擎,但在处理复杂的验证码时,可能需要一些额外的优化来提高识别率。以下是一些常见的优化方法:

  1. 字符白名单
    如果验证码只包含数字或字母,可以通过设置字符白名单来提高识别精度:

java

instance.setTessVariable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
2. 设置页面分割模式(PSM)
Tesseract 支持不同的页面分割模式(PSM),可以根据验证码的结构选择合适的模式。对于常见的单行文本,可以使用 --psm 7(假设图像中只有一个文本行)。

java

instance.setTessVariable("tessedit_char_whitelist", "0123456789");
instance.setPageSegMode(ITesseract.PageSegMode.PSM_SINGLE_LINE); // 设置单行模式
3. 去噪与增强图像质量
可以使用图像处理技术,如去噪、锐化或增强对比度,来提高 OCR 的准确性。这些操作可以使用 Java 的图像处理库(如 BufferedImage 和 Graphics2D)来实现。

  1. 运行程序
    保存代码为 CaptchaRecognition.java,并确保将验证码图像(例如 captcha.png)放在项目目录中。使用以下命令编译并运行程序:

bash

javac CaptchaRecognition.java
java CaptchaRecognition
程序将输出识别的验证码文本。

posted @   ttocr、com  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示