使用 Java 解析验证码:结合 Tesseract OCR 进行文本识别
- 环境准备
1.1 安装 Java
如果尚未安装 Java,可前往 Oracle 官方网站 或 Adoptium 下载最新版本的 JDK。安装完成后,运行以下命令检查版本:
bash
java -version
1.2 安装 Tesseract OCR
Windows
从 Tesseract GitHub 下载并安装。安装完成后,记得将 tesseract.exe 目录添加到环境变量。
Linux(Ubuntu)
bash
sudo apt update
sudo apt install tesseract-ocr libtesseract-dev
macOS(Homebrew)
bash
brew install tesseract
安装完成后,检查 Tesseract 是否安装成功:
bash
tesseract --version
1.3 添加 Tesseract Java 库
在 Java 代码中使用 Tesseract OCR,我们需要使用 Tess4J,它是 Tesseract 的 Java 封装库。
如果使用 Maven,请在 pom.xml 中添加以下依赖:
xml
gradle
dependencies {
implementation 'net.sourceforge.tess4j:tess4j:4.5.5'
}
2. Java 代码实现
创建 CaptchaReader.java,写入以下代码:
java
import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class CaptchaReader {
public static void main(String[] args) {
String imagePath = "captcha.png"; // 替换为你的验证码图片路径
// 预处理验证码
String processedImagePath = "processed_captcha.png";
preprocessImage(imagePath, processedImagePath);
// 使用 Tesseract 进行 OCR 识别
ITesseract tesseract = new Tesseract();
tesseract.setDatapath("tessdata"); // Tesseract 语言数据路径
tesseract.setLanguage("eng"); // 设置语言
try {
String result = tesseract.doOCR(new File(processedImagePath));
System.out.println("识别出的验证码: " + result.trim());
} catch (TesseractException e) {
System.err.println("OCR 识别失败: " + e.getMessage());
}
}
/**
* 预处理验证码图像,提高 OCR 识别率
*/
public static void preprocessImage(String inputPath, String outputPath) {
try {
BufferedImage image = ImageIO.read(new File(inputPath));
// 转换为灰度图像
BufferedImage grayImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
Graphics g = grayImage.getGraphics();
g.drawImage(image, 0, 0, null);
g.dispose();
// 二值化处理
for (int x = 0; x < grayImage.getWidth(); x++) {
for (int y = 0; y < grayImage.getHeight(); y++) {
int rgb = grayImage.getRGB(x, y);
int gray = (rgb >> 16) & 0xFF;
grayImage.setRGB(x, y, (gray > 128) ? Color.WHITE.getRGB() : Color.BLACK.getRGB());
}
}
// 保存处理后的图片
ImageIO.write(grayImage, "png", new File(outputPath));
} catch (IOException e) {
System.err.println("图像处理失败: " + e.getMessage());
}
}
}
3. 代码解析
3.1 图像预处理
为了提高 OCR 识别率,代码对验证码进行以下优化:
转换为灰度图像,去除颜色干扰:
java
BufferedImage grayImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
二值化处理,增强对比度:
java
int gray = (rgb >> 16) & 0xFF;
grayImage.setRGB(x, y, (gray > 128) ? Color.WHITE.getRGB() : Color.BLACK.getRGB());
保存处理后的图片,方便后续 OCR 识别:
java
ImageIO.write(grayImage, "png", new File(outputPath));
3.2 OCR 识别
创建 Tesseract 实例
java
ITesseract tesseract = new Tesseract();
设置 OCR 语言
java
tesseract.setLanguage("eng");
执行 OCR 解析
java
String result = tesseract.doOCR(new File(processedImagePath));
4. 运行程序
确保 captcha.png 放在程序目录下,然后运行:
bash
javac -cp .:tess4j.jar CaptchaReader.java
java -cp .:tess4j.jar CaptchaReader
如果使用 Maven,则运行:
bash
mvn compile exec:java -Dexec.mainClass="CaptchaReader"
示例输出:
makefile
识别出的验证码: X7G9H
5. 提高 OCR 识别率
5.1 选择不同的 Tesseract PSM 模式
java
tesseract.setPageSegMode(6); // 单行文本模式
5.2 限制识别字符集
java
更多内容访问ttocr.com或联系1436423940
tesseract.setTessVariable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
5.3 使用更强的验证码处理
如果验证码干扰较多,可以使用 OpenCV 进行形态学处理,例如去除噪点、字符分割等。
浙公网安备 33010602011771号