当前位置: 首页 > news >正文

Java 和 Tesseract 实现验证码识别

验证码(CAPTCHA)广泛应用于网站和应用程序中,用于防止自动化机器人提交表单或进行不当操作。虽然验证码设计的目的是为了阻止机器人,但在某些情况下,我们希望能够通过自动化的方式来识别这些验证码。本文将介绍如何使用 Java 和 Tesseract OCR 引擎来识别验证码。

环境准备
安装 Tesseract OCR
首先,你需要在你的计算机上安装 Tesseract OCR 引擎。根据操作系统的不同,安装方法也有所不同:
Windows:可以从 Tesseract GitHub 下载并安装。安装完成后,记下 Tesseract 可执行文件的路径。
Linux:使用以下命令进行安装:
更多内容访问ttocr.com或联系1436423940
sudo apt-get install tesseract-ocr
macOS:使用 Homebrew 安装:

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

tesseract --version
安装 Java 环境
确保你已经安装了 Java 开发环境。如果你尚未安装 Java,可以从 Oracle 官网 下载并安装。安装完成后,通过以下命令检查 Java 版本:

java -version
配置 Java 项目
在 Java 项目中,我们将使用 Tesseract OCR Java Wrapper 来调用 Tesseract OCR 引擎。你可以使用 Maven 或 Gradle 来管理依赖,或者直接下载 JAR 包。

如果你使用 Maven,可以在 pom.xml 中添加以下依赖:

net.sourceforge.tess4j tess4j 4.5.3 2. 编写验证码识别代码 以下是一个 Java 程序,展示了如何使用 Tesseract OCR 引擎识别验证码。我们使用 Tess4J(Tesseract Java Wrapper)来操作 Tesseract 引擎。
import net.sourceforge.tess4j.*;

import java.io.File;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;

public class CaptchaRecognition {

public static void main(String[] args) {
// 设置 Tesseract 可执行文件路径
File tessDataFolder = new File("C:/Program Files/Tesseract-OCR/tessdata"); // 修改为你的路径

ITesseract instance = new Tesseract();  // 创建 Tesseract 实例
instance.setLanguage("eng");  // 设置语言
instance.setDatapath(tessDataFolder.getAbsolutePath());  // 设置语言数据路径try {// 读取验证码图像BufferedImage img = ImageIO.read(new File("captcha.png"));// 使用 Tesseract 识别图像中的文本String result = instance.doOCR(img);// 输出识别结果System.out.println("识别的验证码是: " + result.trim());
} catch (Exception e) {e.printStackTrace();
}

}
}
3. 图像预处理
为了提高 OCR 识别的准确性,我们可以对验证码图像进行一些预处理。常见的预处理操作包括:

灰度化:将彩色图像转换为灰度图,减少颜色干扰。
二值化:将灰度图像转换为黑白图像,提高字符与背景的对比度。
去噪:通过滤波算法去除图像中的噪声,使文字更加清晰。
你可以使用 BufferedImage 类对图像进行处理,以下是一个简单的图像预处理示例:

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

public class ImagePreprocessing {

public static BufferedImage preprocessImage(BufferedImage img) {
// 转为灰度图像
BufferedImage grayImg = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
for (int i = 0; i < img.getWidth(); i++) {
for (int j = 0; j < img.getHeight(); j++) {
Color color = new Color(img.getRGB(i, j));
int gray = (int) (0.3 * color.getRed() + 0.59 * color.getGreen() + 0.11 * color.getBlue());
grayImg.setRGB(i, j, new Color(gray, gray, gray).getRGB());
}
}

// 二值化处理
BufferedImage binarizedImg = new BufferedImage(grayImg.getWidth(), grayImg.getHeight(), BufferedImage.TYPE_BYTE_BINARY);
for (int i = 0; i < grayImg.getWidth(); i++) {for (int j = 0; j < grayImg.getHeight(); j++) {Color color = new Color(grayImg.getRGB(i, j));int threshold = 128;  // 阈值int binaryValue = (color.getRed() < threshold) ? 0 : 255;binarizedImg.setRGB(i, j, new Color(binaryValue, binaryValue, binaryValue).getRGB());}
}return binarizedImg;

}
}
在主程序中,调用 preprocessImage() 函数对图像进行预处理:

BufferedImage img = ImageIO.read(new File("captcha.png"));
BufferedImage preprocessedImg = ImagePreprocessing.preprocessImage(img);
String result = instance.doOCR(preprocessedImg);
4. 提高识别准确率
尽管 Tesseract 是一个强大的 OCR 引擎,但在一些复杂的验证码场景下,识别可能并不完美。以下是一些常见的优化方法:

使用字符白名单
如果验证码只包含数字或字母,可以通过设置字符白名单来限制 Tesseract 只识别这些字符,从而提高识别准确度:
instance.setTessVariable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
2. 调整 OCR 参数
Tesseract 提供了多种配置选项来优化识别过程。例如,你可以通过调整 psm(页面分割模式)来选择适合的页面布局模式:

psm 6:适用于单行文本。
psm 3:适用于标准文档布局。
设置参数的方法如下:

instance.setPageSegMode(ITesseract.PageSegMode.PSM_SINGLE_BLOCK);
3. 图像分割
对于包含多个字符的验证码,你可以将图像分割成多个小图像,分别进行 OCR 识别,然后组合结果。可以使用 OpenCV 或 Java 内置的图像处理工具来检测字符区域并分割图像。

去噪
使用更强大的去噪算法,如高斯模糊,帮助去除背景噪声,突出字符部分。你也可以尝试更高级的去噪库来进行图像优化。

运行程序
保存代码为 CaptchaRecognition.java,并确保你已经正确配置了 Tesseract 可执行文件的路径。将验证码图像(如 captcha.png)放在项目目录中。然后,在命令行中运行:

javac CaptchaRecognition.java
java CaptchaRecognition
成功运行后,输出类似于:

makefile

识别的验证码是: X9D2A

http://www.wxhsa.cn/company.asp?id=2897

相关文章:

  • 基于 Weiler–Atherton 算法的 IoU 求解
  • Selenium应用中的核心JavaScript操作技巧
  • 25.9.13 字符编码标准
  • 哭了,散了,明白了
  • 用 Java 和 Tesseract 实现验证码识别
  • Microsoft-Activation-Scripts,好用,记录一下。
  • 双重map 的赋值初始化
  • 0voice-1.4.1
  • 9.13 模拟赛 T3
  • Docker应用 - FileBrowser
  • AI踩坑之Nlog使用
  • 论文解读-《OpenGSL A Comprehensive Benchmark for Graph Structure Learning》 - zhang
  • Cmake介绍
  • Git 生成 ssh key
  • 基础篇:消息队列理论部分,另一种环境搭建Docker运行RabbitMQ
  • 项目案例作业1:学生信息管理系统(面向对象初步接触)
  • P1097 合唱队形
  • 一生一芯学习:pa2.1 RTFM
  • Linux网络:初识网络 - 详解
  • 20250909比赛总结
  • 又寸入生白勺司烤
  • Ubuntu 安装 GIPM
  • 手动下载vscode扩展的方法
  • GAS_Aura-Aura Projectile
  • CF1583F Defender of Childhood Dreams
  • scrollArea无法滚动
  • 时间序列分析(1)
  • 一行代码没写,做了一个小程序
  • 【置顶】欢迎来到 ziyaojia 的主页
  • copyparty 是一款使用单个 Python 材料实现的内网文件共享软件,具有跨平台、低资源占用等特点,适合需要本地化文件管理的场景