Java 和 Tesseract 实现验证码识别

news/2025/1/27 12:59:03/文章来源:https://www.cnblogs.com/ocr12/p/18692548

验证码(CAPTCHA)是广泛应用于各种网站和平台的验证工具,用于区分人类用户与自动化脚本或机器人。为了提高用户体验或自动化流程,有时我们需要通过编程来识别和处理验证码。本文将展示如何使用 Java 编程语言结合 Tesseract OCR 引擎实现验证码的自动识别。

  1. 环境准备
    安装 Tesseract OCR 引擎
    首先,我们需要安装 Tesseract OCR 引擎。Tesseract 是一个开源的 OCR 引擎,支持多种语言的文字识别。

Windows:你可以从 Tesseract 官方 GitHub 下载适用于 Windows 的安装包。安装时请注意将 Tesseract 添加到系统环境变量中。
Linux:在 Linux 上,使用以下命令安装:
bash
更多内容访问ttocr.com或联系1436423940
sudo apt-get install tesseract-ocr
macOS:使用 Homebrew 安装:
bash

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

bash

tesseract --version
安装 Java 和相关依赖
确保你已经安装了 Java Development Kit (JDK)。你可以从 Oracle 官网 或 AdoptOpenJDK 下载并安装 JDK。

接下来,使用 Maven 来管理 Java 项目的依赖,Tesseract 的 Java 库 Tesseract4J 可以通过 Maven 安装。在项目的 pom.xml 文件中添加以下依赖:

xml

net.sourceforge.tess4jtess4j4.5.5org.apache.commonscommons-io2.8.0 2. 编写验证码识别代码 下面是一个简单的 Java 程序,它利用 Tesseract 进行验证码的识别。我们将图像加载并传递给 Tesseract 引擎,最后输出识别的结果。

java

import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.util.ImageHelper;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;

public class CaptchaRecognition {
public static void main(String[] args) {
// 设置 Tesseract 数据文件的路径
String tessDataPath = "C:/Program Files/Tesseract-OCR/tessdata"; // 根据实际安装路径修改

    // 创建 Tesseract 实例ITesseract instance = new Tesseract();instance.setDatapath(tessDataPath); // 设置 Tesseract 数据路径instance.setLanguage("eng"); // 设置语言为英文try {// 读取验证码图像File captchaImage = new File("captcha.png");BufferedImage image = ImageIO.read(captchaImage);// 执行 OCR 识别String result = instance.doOCR(image);// 输出识别结果System.out.println("识别的验证码是: " + result.trim());} catch (Exception e) {System.err.println(e.getMessage());}
}

}
代码说明:
Tesseract 数据路径:通过 instance.setDatapath 设置 Tesseract 数据文件的路径。tessdata 文件夹中包含了 Tesseract 所需的语言文件。
图像读取:通过 ImageIO.read 读取图像文件(例如 captcha.png)。
OCR 识别:使用 instance.doOCR(image) 执行 OCR 识别,返回识别的文本。
输出结果:识别的文本会被输出到控制台。
3. 图像预处理
为了提高验证码识别的准确性,我们可以对图像进行一些预处理。常见的预处理操作包括灰度化、二值化、去噪等。下面是一个示例,展示如何对验证码图像进行灰度化和二值化处理。

java

import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.util.ImageHelper;
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;

public class CaptchaRecognition {
public static void main(String[] args) {
// 设置 Tesseract 数据文件的路径
String tessDataPath = "C:/Program Files/Tesseract-OCR/tessdata"; // 根据实际安装路径修改

    // 创建 Tesseract 实例ITesseract instance = new Tesseract();instance.setDatapath(tessDataPath); // 设置 Tesseract 数据路径instance.setLanguage("eng"); // 设置语言为英文try {// 读取验证码图像File captchaImage = new File("captcha.png");BufferedImage image = ImageIO.read(captchaImage);// 图像预处理: 灰度化BufferedImage grayImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_BYTE_GRAY);grayImage.getGraphics().drawImage(image, 0, 0, null);// 图像预处理: 二值化BufferedImage binarizedImage = 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++) {Color c = new Color(grayImage.getRGB(x, y));int grayValue = (c.getRed() + c.getGreen() + c.getBlue()) / 3;if (grayValue < 128) {binarizedImage.setRGB(x, y, Color.BLACK.getRGB());} else {binarizedImage.setRGB(x, y, Color.WHITE.getRGB());}}}// 执行 OCR 识别String result = instance.doOCR(binarizedImage);// 输出识别结果System.out.println("识别的验证码是: " + result.trim());} catch (Exception e) {System.err.println(e.getMessage());}
}

}
代码说明:
灰度化:通过 BufferedImage.TYPE_BYTE_GRAY 创建一个灰度图像,并使用 getGraphics().drawImage() 方法将原图像绘制到灰度图像上。
二值化:通过遍历灰度图像的每个像素,根据其灰度值与阈值(128)进行比较,将其转换为黑色或白色。
4. 提高识别准确率
虽然 Tesseract 是一个功能强大的 OCR 引擎,但在处理复杂的验证码时,可能需要一些额外的优化来提高识别率。以下是一些常见的优化方法:

  1. 字符白名单
    如果验证码只包含数字或字母,可以通过设置字符白名单来提高识别精度:

java

instance.setTessVariable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
2. 设置页面分割模式(PSM)
Tesseract 支持不同的页面分割模式(PSM),可以根据验证码的结构选择合适的模式。对于常见的单行文本,可以使用 --psm 7(假设图像中只有一个文本行)。

java

instance.setTessVariable("tessedit_char_whitelist", "0123456789");
instance.setPageSegMode(ITesseract.PageSegMode.PSM_SINGLE_LINE); // 设置单行模式
3. 去噪与增强图像质量
可以使用图像处理技术,如去噪、锐化或增强对比度,来提高 OCR 的准确性。这些操作可以使用 Java 的图像处理库(如 BufferedImage 和 Graphics2D)来实现。

  1. 运行程序
    保存代码为 CaptchaRecognition.java,并确保将验证码图像(例如 captcha.png)放在项目目录中。使用以下命令编译并运行程序:

bash

javac CaptchaRecognition.java
java CaptchaRecognition
程序将输出识别的验证码文本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/876213.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VS Code 报错 __float128 is not supported on this target 解决方法

最近在使用 VS Code 时,每一个 cpp 文件都会有如下报错:在中文互联网上并没有搜索到很好的解决方案,但是在 stack overflow 上找到了一个比较好的回答:This problem may be caused by your VSCode using clang-tidy as the C/C++ extension. clang-tidy does not support _…

A Critique of ANSI SQL Isolation Levels.18687395

原文:A critique of ANSI SQL isolation levels摘要:ANSI SQL-92[MS, ANSI]使用脏读、不可重复读以及幻读现象(phenomena)定义了隔离级,本论文展示了这些现象,以及ANSI SQL定义并无法合适的描述众多流行的隔离级别,包括(ANSI标准)所涵盖的级别的标准锁实现。我们还介绍…

0127人工智能创新型教师培育计划(第一期) 试题

# 试题 http://site01.openhydra.net:30012/evt/uploadcode人工智能创新型教师培育计划(第一期)​ 【活动进展每日更新1月26日】​活动更新(1月26日 22:00更新): Python作业​教师AI基础考核作业(见下面介绍),或者可以下载word文件 查看。 1月31日中午24:00前提交, 作…

.net core 使用账号密码方式读取SharePoint 文件(记录)

项目环境 .net 6.0 原代码 是.netframework 4.6 原代码引用了Microsoft.SharePoint.Client 包去操作.其中身份验证的使用的是 SharePointOnlineCredentials 类.但迁移到.net 6,0 后发现这个类已经被移除.测试了常用 的各种方式,大部分均返回403 解决方案: 使用包 dotnet add…

mkcert生成ssl证书+nginx部署局域网内的https服务访问

环境 使用的是树莓派 安装的是ubuntu 系统 https://github.com/FiloSottile/mkcert/releases 下载 添加权限 chmod 777 ./mkcert-v1.4.4-linux-arm64 1、CA 证书加入本地可信 CA ./mkcert-v1.4.4-linux-arm64 -install 2、生成自签证书 ./mkcert-v1.4.4-linux-arm64 …

iPhone 拍摄 LED 灯带视频时候如何防频闪 All In One

iPhone 拍摄 LED 灯带视频时候如何防频闪 All In One 闪动频率不一致 bug? 60Hz 50HziPhone 拍摄 LED 灯带视频时候如何防频闪 All In One闪动频率不一致 bug?60Hz 50Hz errorshttps://www.bilibili.com/video/BV1F5fkY6ERS/ 问题分析 灯的问题,灯在闪。 交流电是 50Hz(中国…

iPhone 视频拍摄 LED 灯带时候如何防频闪 All In One

iPhone 视频拍摄 LED 灯带时候如何防频闪 All In One 闪动频率不一致 bug? 60Hz 50HziPhone 视频拍摄 LED 灯带时候如何防频闪 All In One闪动频率不一致 bug?60Hz 50Hz errorshttps://www.bilibili.com/video/BV1F5fkY6ERS/ solutions demos(🐞 反爬虫测试!打击盗版⚠️)…

AI智能体(Agent)总体框架及技术发展现状

智能体(Agent)定义 AI智能体,又称AI代理或 Al Agent,是能够感知环境,基于目标进行决策并执行动作的智能化应用。它具备自主性、交互性、反应性和适应性等基本特征,能够在复杂多变的环境中独立完成任务。智能体的出现,标志着人工智能从简单的规则匹配和计算模拟向更高级别的…

记忆层以前所未有的方式增强了LLMs

深入探讨记忆层如何工作,以及它们如何增强LLMs,以至于下一代AI架构如果不采用它们,将会错失良机。图像由DALL-E 3生成LLMs(大型语言模型)是存储在其参数中的庞大信息知识库(主要是以密集层中线性矩阵变换的权重形式存在)。 然而,随着参数规模的增长,计算成本和能源消耗…

知识蒸馏技术原理详解:从软标签到模型压缩的实现机制

知识蒸馏是一种通过性能与模型规模的权衡来实现模型压缩的技术。其核心思想是将较大规模模型(称为教师模型)中的知识迁移到规模较小的模型(称为学生模型)中。本文将深入探讨知识迁移的具体实现机制。知识蒸馏原理 知识蒸馏的核心目标是实现从教师模型到学生模型的知识迁移。…

GIS数据合集:作物、植被数据下载平台整理

本文对目前主要的作物类型与产量、植被物候与指数数据产品的获取网站加以整理与介绍~本文对目前主要的作物类型与产量、植被物候与指数数据产品的获取网站加以整理与介绍。 目录4 植被农业数据4.1 作物产量数据4.1.1 SPAM4.1.2 Aerial Intelligence4.2 作物物候数据4.2.1 China…

关于光学?

物理快成唐氏了,写篇笔记记录一下。 光学做题笔记 凸透镜成像规律 或曰:一倍焦距分虚实,二倍焦距分大小; 物近像远像变大,物远像近像变小。一般地,我们称物体到凸透镜的距离为物距(\(u\)),物体所成的像到凸透镜的距离为像距(\(v\))。设下面凸透镜焦距 \(f=10\ cm\):…