在实际开发中,很多网页都采用验证码防止机器人自动提交表单。如果我们希望通过自动化脚本处理这些网页,就需要一种方法来“读懂”验证码。Tesseract 是目前最主流的开源 OCR(Optical Character Recognition,光学字符识别)引擎之一。今天我们将通过 Java 调用 Tesseract,实现从验证码图片中提取文字的全过程。
准备工作\
- 安装 Tesseract 你可以从 Tesseract 官方 GitHub 下载对应平台的版本。安装完成后,确保将 tesseract 命令添加到环境变量中。
- 获取 tess4j tess4j 是 Java 调用 Tesseract 的桥梁。通过 Maven 添加依赖:
net.sourceforge.tess4j tess4j 5.4.0
代码实现步骤
- OCR 识别核心类
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;
public class CaptchaReader {
public static String extractTextFromImage(String imagePath) {
File imageFile = new File(imagePath);
ITesseract tesseract = new Tesseract();
// 设置语言包目录
tesseract.setDatapath("tessdata");
// 设置识别语言
tesseract.setLanguage("eng");
// 可选:设置页面分割模式为“单行文本”
tesseract.setPageSegMode(7);
try {
BufferedImage image = ImageIO.read(imageFile);
String result = tesseract.doOCR(image);
return result.replaceAll("\\s+", ""); // 去除空白字符
} catch (Exception e) {
e.printStackTrace();
return "识别失败";
}
}
} 2. 简单测试类
public class Main { public static void main(String[] args) { String result = CaptchaReader.extractTextFromImage("src/main/resources/captcha.png"); System.out.println("识别结果: " + result); } } 🧪 测试效果 图片内容:W8K5X
识别结果输出:W8K5X
识别准确率高时,说明验证码样式简单,无需复杂处理。如果识别出现偏差,可以尝试下面的增强处理。
图像预处理建议 验证码图片如果有干扰线或背景杂色,建议使用如下图像预处理方式提升识别效果:
灰度化处理:将彩色图像转为灰度图。
二值化处理:将图像中每个像素转为黑或白。
图像锐化:增强字符边缘。
缩放图像:适当放大图像,提升字符清晰度。
这些可通过 Java 的 BufferedImage 搭配像素级处理或 OpenCV Java 版实现。