验证码自动识别:使用 Java 和 Tesseract OCR 实现
验证码(CAPTCHA)用于防止机器人自动提交数据,但在自动化测试、数据采集等场景中,我们可能需要自动识别验证码。本文将介绍如何使用 Java 结合 Tesseract OCR 解析验证码,并优化识别准确度。
- 环境准备
在开始编写代码之前,我们需要安装 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 中添加以下依赖:
如果使用 Gradle,在 build.gradle 中添加:
dependencies {
implementation 'net.sourceforge.tess4j:tess4j:4.5.5'
}
- 代码实现
下面的 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;
}
}
- 代码解析
3.1 图像预处理
为了提高 OCR 识别率,我们对验证码图像进行了以下优化处理:
灰度化:提取验证码的亮度信息,去除颜色干扰。
二值化:将像素转换为黑白,使字符更加清晰可见。
Java 没有 OpenCV 这样强大的图像处理库,所以我们手动遍历像素进行灰度转换和二值化处理。
3.2 OCR 解析
Tesseract() 初始化 OCR 引擎。
setLanguage("eng") 设置 OCR 语言,默认使用 eng(英语)。
setTessVariable("tessedit_char_whitelist", "...") 限制可识别字符,避免误识别。
setPageSegMode(6) 使用 PSM 6 进行单行文本识别。
doOCR() 执行 OCR 解析,返回识别出的文本。
- 运行程序
将代码保存为 CaptchaRecognizer.java,并确保 captcha.png 在同一目录下,然后编译运行:
javac -cp ".;tess4j-4.5.5.jar" CaptchaRecognizer.java
java -cp ".;tess4j-4.5.5.jar" CaptchaRecognizer
程序会加载验证码图像,进行处理并输出识别结果。
- 提高验证码识别准确率
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)
浙公网安备 33010602011771号