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

验证码(CAPTCHA)是网络安全的重要组成部分,用于防止自动化脚本进行数据提交和恶意攻击。在一些情况下,开发人员可能需要识别验证码,例如在自动化测试和数据采集任务中。本文将介绍如何使用 Java 和 Tesseract OCR 进行验证码识别,并优化识别效果。

🧰 环境准备

  1. 安装 Java 和 Maven
    首先,请确保已安装 Java 开发工具包(JDK)和 Maven 构建工具。使用以下命令检查是否成功安装:

java -version
mvn -v
如果未安装,请从 Oracle 官方网站下载并安装 Java,并从 Maven 官网下载并安装 Maven。
更多内容访问ttocr.com或联系1436423940
2. 安装 Tesseract OCR 引擎
Tesseract 是一个开源的光学字符识别(OCR)引擎。根据不同操作系统的要求,选择相应的安装方法。

Windows 用户:
下载 Tesseract 安装包并按照安装指引进行安装。

Linux 用户(Ubuntu):

sudo apt-get update
sudo apt-get install tesseract-ocr
macOS 用户:

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

tesseract --version
3. 添加 Maven 依赖
为了让 Java 与 Tesseract 配合使用,需要添加 Tesseract OCR 的 Java 包(Tess4J)。在你的 pom.xml 文件中添加以下依赖:

net.sourceforge.tess4j tess4j 5.4.0 🧩 实现验证码识别 1. 创建 Tesseract OCR 服务

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

public class TesseractService {

public static String recognizeCaptcha(File imageFile) {
    // 创建 Tesseract OCR 实例
    ITesseract instance = new Tesseract();
    instance.setDatapath("tessdata");  // 设置 Tesseract 的数据路径
    instance.setLanguage("eng");        // 设置语言(默认是英文)

    try {
        // 读取验证码图片
        BufferedImage image = ImageIO.read(imageFile);
        // 使用 Tesseract 进行 OCR 识别
        return instance.doOCR(image).trim();
    } catch (TesseractException | IOException e) {
        e.printStackTrace();
        return "识别失败";
    }
}

}
2. 调用 OCR 服务
创建一个控制器来调用这个 OCR 服务并返回结果:

import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;

@RestController
@RequestMapping("/captcha")
public class CaptchaController {

@PostMapping("/recognize")
public String recognizeCaptcha(@RequestParam("file") MultipartFile file) throws Exception {
    // 将上传的文件保存为临时文件
    File tempFile = File.createTempFile("captcha_", ".png");
    file.transferTo(tempFile);

    // 调用 OCR 服务进行识别
    String result = TesseractService.recognizeCaptcha(tempFile);

    // 删除临时文件
    tempFile.delete();

    return "识别结果: " + result;
}

}
3. 设置 Tessdata 路径
请确保你的 tessdata 文件夹路径正确。Tesseract 需要包含其训练数据文件(.traineddata 文件)。在你的项目中,可以将这些文件放置在 tessdata 文件夹下,并设置该路径。

🛠️ 图像预处理优化
有时,验证码图像可能包含噪声、模糊、低对比度等问题,导致识别效果不理想。通过对图像进行预处理,能够有效提高识别的准确率。常见的图像预处理方法包括灰度化、二值化和去噪处理。

  1. 灰度化与二值化
    以下代码演示了如何将图像转换为灰度图,并进行二值化处理:

import java.awt.Color;
import java.awt.image.BufferedImage;

public class ImageProcessor {

// 将图像转换为灰度图像
public static BufferedImage convertToGrayscale(BufferedImage image) {
    BufferedImage grayImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
    for (int x = 0; x < image.getWidth(); x++) {
        for (int y = 0; y < image.getHeight(); y++) {
            Color color = new Color(image.getRGB(x, y));
            int gray = (int)(0.3 * color.getRed() + 0.59 * color.getGreen() + 0.11 * color.getBlue());
            grayImage.setRGB(x, y, new Color(gray, gray, gray).getRGB());
        }
    }
    return grayImage;
}

// 将图像进行二值化处理
public static BufferedImage convertToBinary(BufferedImage grayImage) {
    BufferedImage binaryImage = 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++) {
            int rgb = grayImage.getRGB(x, y);
            int value = rgb == Color.BLACK.getRGB() ? 0 : 255;
            binaryImage.setRGB(x, y, new Color(value, value, value).getRGB());
        }
    }
    return binaryImage;
}

}
2. 在 TesseractService 中集成图像处理

public static String recognizeCaptcha(File imageFile) {
ITesseract instance = new Tesseract();
instance.setDatapath("tessdata");
instance.setLanguage("eng");

try {
    // 读取图像文件
    BufferedImage image = ImageIO.read(imageFile);
    // 预处理图像
    BufferedImage grayImage = ImageProcessor.convertToGrayscale(image);
    BufferedImage binaryImage = ImageProcessor.convertToBinary(grayImage);
    // 使用 Tesseract 进行 OCR 识别
    return instance.doOCR(binaryImage).trim();
} catch (TesseractException | IOException e) {
    e.printStackTrace();
    return "识别失败";
}

}
📈 识别率优化建议
选择合适的页面分割模式(PSM):
Tesseract 提供不同的页面分割模式,针对验证码图像,使用 PSM 6(假设单行文本)可以提高识别的准确度:

instance.setTessVariable("tessedit_pageseg_mode", "6");
训练 Tesseract 自定义模型:
如果验证码图像有特殊的字体或者样式,可以通过训练自定义语言模型来提高识别准确性。

去噪声处理:
可以使用图像处理技术(如高斯模糊)来去除图像中的噪声,这对于提升识别效果非常有效。

深度学习 OCR:
如果 Tesseract 的效果仍然不理想,可以考虑使用基于深度学习的 OCR 方案,如 EasyOCR 或 PaddleOCR,这些工具对于复杂的验证码识别有较好的效果。

posted @ 2025-04-13 11:42  ttocr、com  阅读(123)  评论(0)    收藏  举报