使用 Java 和 Tesseract 进行验证码识别

news/2025/1/22 23:32:40/文章来源:https://www.cnblogs.com/ocr12/p/18686952

验证码(CAPTCHA)在网站和应用中被广泛用作防止自动化操作的验证机制。如果想要识别验证码,可以借助 OCR(光学字符识别)技术实现自动识别。本文将介绍如何使用 Java 和 Tesseract OCR 引擎来实现验证码的识别。

  1. 环境准备
    安装 Tesseract OCR 引擎
    Tesseract 是一个开源的 OCR 引擎,必须单独安装。可以从 Tesseract 官方 GitHub 页面 下载并安装:

Windows 用户:下载适用于 Windows 的安装包并安装。
Linux 用户:使用以下命令安装:
bash

sudo apt install tesseract-ocr
macOS 用户:使用 Homebrew 安装:
bash

brew install tesseract
安装完成后,使用以下命令检查是否安装成功:

bash

tesseract --version
安装 Java 和必要的依赖
确保已经安装 Java 开发工具包 (JDK)。如果尚未安装,可以从 Oracle 或 OpenJDK 下载并安装。

我们将使用 Tess4J,它是 Tesseract 的 Java 封装库,提供了与 Tesseract 引擎交互的简化接口。

安装 Tess4J
可以通过 Maven 管理 Tess4J 依赖。确保你的项目使用 Maven 构建工具,然后在 pom.xml 文件中添加以下依赖:

xml
复制
编辑

net.sourceforge.tess4j
tess4j
5.4.0

2. 编写验证码识别代码
以下是完整的 Java 示例代码,展示了如何加载验证码图像并通过 Tesseract 进行识别:

java

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 CaptchaRecognition {
public static void main(String[] args) {
// 图像路径更多内容访问ttocr.com或联系1436423940
String imagePath = "captcha.png"; // 替换为你的验证码图片路径

    // 加载图像文件BufferedImage image = null;try {image = ImageIO.read(new File(imagePath));} catch (IOException e) {System.err.println("图像加载失败:" + e.getMessage());return;}// 创建 Tesseract 实例ITesseract tesseract = new Tesseract();// 设置 Tesseract 的数据路径和语言// 确保 tesseractdata 文件夹的路径正确tesseract.setDatapath("tessdata");tesseract.setLanguage("eng");// 识别图像中的文字try {String result = tesseract.doOCR(image);System.out.println("识别的验证码是: " + result);} catch (TesseractException e) {System.err.println("OCR 识别失败:" + e.getMessage());}
}

}
3. 代码解析
图像加载
我们通过 ImageIO.read 加载验证码图像,生成一个 BufferedImage 对象,供后续处理。
Tesseract 初始化
使用 Tesseract 类创建 OCR 引擎实例。
调用 setDatapath 设置 Tesseract 的 tessdata 文件路径,该路径包含 OCR 必需的数据文件。
调用 setLanguage 设置识别语言(如 eng 表示英文)。
图像识别
使用 doOCR 方法传入图像对象,识别其中的文字并返回结果。
如果识别失败,会抛出 TesseractException 异常,我们在代码中进行了捕获处理。
4. 图像预处理(可选)
为了提高识别准确度,可能需要对验证码图像进行预处理。例如:

灰度化:将图像转换为灰度图,去除颜色干扰。
二值化:将图像中的像素值二值化为黑白,增强对比度。
降噪:去除图像中的噪点。
可以使用 Java 图像处理库(如 java.awt.image 或第三方库如 OpenCV)实现这些预处理步骤。

以下是一个简单的灰度化示例:

java

private static BufferedImage convertToGrayscale(BufferedImage img) {
BufferedImage grayImg = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
for (int x = 0; x < img.getWidth(); x++) {
for (int y = 0; y < img.getHeight(); y++) {
int rgb = img.getRGB(x, y);
grayImg.setRGB(x, y, rgb);
}
}
return grayImg;
}
5. 运行程序
将代码保存为 CaptchaRecognition.java。
编译代码:
bash

javac -cp .:tess4j-5.4.0.jar CaptchaRecognition.java
运行程序:
bash

java -cp .:tess4j-5.4.0.jar CaptchaRecognition
程序会加载图像文件并输出识别的验证码文本,例如:

makefile

识别的验证码是: X1Y2Z3
6. 提高识别准确率
调整 Tesseract 配置
Tesseract 支持多种页面分割模式(PSM)。可以通过 tesseract.setPageSegMode 方法设置:
java

tesseract.setPageSegMode(ITessAPI.TessPageSegMode.PSM_SINGLE_LINE);
自定义训练
如果验证码使用了特殊字体或语言,可以通过训练 Tesseract 创建自定义识别模型。详细训练方法可以参考 Tesseract 官方文档。

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

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

相关文章

Tomcat 高并发之道原理拆解与性能调优

上帝视角拆解 Tomcat 架构设计,在了解整个组件设计思路之后。我们需要下凡深入了解每个组件的细节实现。从远到近,架构给人以宏观思维,细节展现饱满的美。 上回👉详情点我【Tomcat】Tomcat 架构原理解析到架构设计借鉴 站在上帝视角给大家拆解了 Tomcat 架构设计,分析 To…

Vue3 —— 安装及配置环境

Vue3的安装、配置(✿◕‿◕✿)Vue官网:https://vuejs.org/配置环境终端:Linux和Mac上可以用自带的终端。Windows上推荐用powershell或者cmd。Git Bash有些指令不兼容。安装Node.js:安装地址:https://nodejs.org/en/安装@vue/cli:执行:npm i -g @vue/cli如果执行后面的操作…

二. Redis 超详细的安装教程((七步)一步一步指导,步步附有截屏操作步骤)

二. Redis 超详细的安装教程((七步)一步一步指导,步步附有截屏操作步骤) @目录二. Redis 超详细的安装教程((七步)一步一步指导,步步附有截屏操作步骤)1. Redis 详细安装教程2. Redis 后台基本启动 & 详细的基本使用3. Redis 服务器的关闭和启动的注意事项4. 如何修改 Re…

数据分库分表和迁移方案

在我们业务快速发展的过程中,数据量必然也会迎来突飞猛涨。那么当我们的数据量百倍、千倍、万倍、亿倍增长后,原有的单表性能就不能满足我们日常的查询和写入了,此时数据架构就不得不进行拆分,比如单表拆分成10张表、100张表、单个月分多张表等等。下面我们针对具体案例分析…

Power BI 连接GaussDB提取数据方法

Power BI本身没有直接的链接器来获取GaussDB,目前连接GaussDB的方法有2个: ODBC, JDBC,这两种方式在云端都要通过设置网关,pbi云端通过网关链接到虚拟机或者某台电脑上,电脑安装个人网关(组织网关没有成功,不知道为什么,知道原因的希望能留言),下面说下两种连接方式: …

2025-1-20-盒子模型-弹性盒子模型

重新学一下巩固,之前发的看不了,本来还想着直接看呢 盒子模型 width,height是宽高,padding是内边距,如果里边有文本的话一般是贴着左上方,但是有内边距就不会,类似下边的演示图;border是内外之间边框,就是给宽高之外加一层;margin是外边距,可以理解为是你构造的边框…

【Ubuntu】安装OpenSSH启用远程连接

【Ubuntu】安装OpenSSH启用远程连接 零、安装软件 使用如下代码安装OpenSSH服务端: sudo apt install openssh-server壹、启动服务 使用如下代码启动OpenSSH服务端: sudo systemctl start ssh贰、配置SSH(可跳过) 配置文件 OpenSSH的配置文件所在位置:/etc/ssh/sshd_confi…

CTF-web第二步!

菜狗杯web的传说之下。打开F12,发现有个Game=new Underophidian(gameCanvas)表明有个Game变量存储着数据。在控制台输入Game获取,根据题意,修改分数,然后玩一下就可以得到flag了。

【CodeForces训练记录】Codeforces Round 1000 (Div. 2)

训练情况赛后反思 C题猜了个假结论WA4,每次选择度最多的删掉,在连续三个度都是最大的情况下,删中间的会寄 A题 有点前缀和的感觉,\([1,l]\) 互质个数为 \(l\),\([1,r]\) 互质个数为 \(r\),所以区间 \([l,r]\) 的个数就是 \(r-l\),特判一下 \(l=1,r=1\) 的情况答案是 \(1\…

GUIClip在IMGUI中的作用

目录简介IMGUIGUIClipPush Pop Count局部坐标StyleDraw中Rect点的位置鼠标位置绝对坐标ScrollOffset对局部坐标的影响局部坐标和绝对坐标的相互转化裁剪参考链接 简介 Unity中的IMGUI是一个独立于ugui的UI系统。IMGUI是事件(消息)驱动的UI系统,主要用于编写开发工具。 Unity官…

ceph-安装

【os】 ubuntu1804 【文心上找到的】 【步骤】一、环境准备‌配置节点名称‌:配置集群各节点的hostname,确保互相可以通过hostname来解析节点IP,不需要通过DNS。 ‌时间同步‌:确保所有节点的时间同步,以避免时间不一致导致的问题。 ‌关闭防火墙和SELinux‌:为了简化安装…

开源项目芋道源码解析 [开篇]

文章首发于我的博客:https://blog.liuzijian.com/post/source-code-about-ruoyi-vue-pro.html 1.引言 芋道(又名yudao,ruoyi-vue-pro)是一个基于spring-boot框架的单体Java后端开源项目,拥有基于RBAC模型的组织架构管理、CRM、ERP、商城、代码生成、AI等多个功能模块。封装了…