当前位置: 首页 > 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

相关文章:

Java 和 Tesseract 实现验证码识别

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

基于 Weiler–Atherton 算法的 IoU 求解

在计算机视觉领域,交并比(Intersection over Union, IoU)作为目标检测任务的核心评价指标,其计算精度直接影响模型性能评估的可靠性。传统 IoU 计算方法在处理标准矩形框时表现良好,但在面对不规则多边形或边界复杂的目标区域时,其计算误差会显著增加。Weiler–Atherton …...

Selenium应用中的核心JavaScript操作技巧

Selenium是一款强大的浏览器自动化测试工具,其操作浏览器的能力部分来自于其内嵌的JavaScript执行引擎。这使得Selenium不仅能够模拟用户在浏览器中的各种操作,还能执行复杂的JavaScript脚本,以实现更为精细的控制。本文将探讨如何通过Selenium应用中的核心JavaScript操作来…...

25.9.13 字符编码标准

ASCII标准十进制 DEC八进制 OCT十六进制 HEX二进制 BIN符号 Symbol中文解释 Description00000000000000NUL空字符10010100000001SOH标题开始20020200000010STX正文开始30030300000011ETX正文结束40040400000100EOT传输结束50050500000101ENQ询问60060600000110ACK收到通知…...

哭了,散了,明白了

昨晚我哭了,一个人坐了很久很久,想了很多事情,低下头,眼泪就掉了下来,突然发现,我没有什么朋友,也没有很爱我的人,我的心一下子就空了,原来我这么孤独,茫茫人海终究只有我自己,就一瞬间,所有的心酸涌上心头,心一下就空了,也没有想说的,就是心里堵的慌,最无助的…...

用 Java 和 Tesseract 实现验证码识别

验证码(CAPTCHA)是为了防止自动化脚本进行恶意行为而设计的图像验证方式,通常用于网站注册、登录或提交表单时。虽然验证码的目标是阻止机器人,但在某些情况下,我们可能需要使用自动化工具来识别这些验证码。本文将介绍如何使用 Java 编程语言和 Tesseract OCR 引擎来识别…...

Microsoft-Activation-Scripts,好用,记录一下。

我自己用的是 eSir 高大全的OpenWrt里面的KMS服务器去激活。不过会遇到激活不成功的概率,尤其是Office,种类繁多,激活不成功概率很高。除非纯净安装系统,那么就次次成功。 前阵子就遇到一个,看电脑不是很纯洁(安装了很多杀毒,360之类的),隔得远又不能重做系统,就搜索…...

双重map 的赋值初始化

示例分析 #include <iostream> #include <map> using namespace std;typedef std::map<uint32_t, int> ST_ATTR; // 内层map:key=uint32_t,value=inttypedef std::map<uint16_t, ST_ATTR> ST_CTRL; // 外层map:key=uint16_t,value=内层mapint main…...

0voice-1.4.1

Makefile-cmake-configure...

9.13 模拟赛 T3

题意:有一个长度为 \(n\) 的数组 \(b\),初始值全为 \(0\)。同时有一个长度为 \(m\) 的序列 \(a_i\)。依次进行操作 \(i=1,2,\dots,n\)。对于操作 \(i\),可以选择 \(b\) 中任意不同的 \(a_i\) 个位置 \(j_1,j_2,\dots,j_{a_i}\),对于每个 \(p=1,2,\dots,a_i\),将 \(b_{j_p}…...

Docker应用 - FileBrowser

Docker应用 - FileBrowser FileBrowser.kg-card { font-family: "Inter Variable", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Arial, Noto Sans, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI…...

AI踩坑之Nlog使用

前景说明:期望扩展一个作用域的日志参数 Chatgpt给出的代码配置是 configid=${sc:item=configid} using (var conn = new OracleConnection(_connectionString)) { LogUtil.Default.LogInfo($"dddddddd"); }添加使用后发现configid值始终为空,问gpt,gpt始终说是因…...

论文解读-《OpenGSL A Comprehensive Benchmark for Graph Structure Learning》 - zhang

1. 论文介绍 论文标题:OpenGSL: A Comprehensive Benchmark for Graph Structure Learning 论文领域:图神经网络,图结构学习 论文发表:Camera-ready version for NeurIPS Datasets and Benchmarks Track 2023 论文代码:https://github.com/OpenGSL/OpenGSL 论文背景:2. 论…...

Cmake介绍

1.Cmake介绍cmake是一个跨平台的,用于构建项目的工具。 关于项目的构建,我们并不陌生,广为人知的,诸如:makefile(使用make命令),与IDE集成的vs的nmake,linux下的GNU make,Qt的qmake等。 如果自己动手写makefile,就会发现,makefile通常依赖于当前的编译平台,并且编译mak…...

Git 生成 ssh key

首先,确保你已经配置了 Git 的用户名和邮箱。打开 Git Bash,执行以下命令: git config --global user.name "你的用户名" git config --global user.email "你的邮箱地址"可以使用 git config --global --list 命令来检查配置是否成功。 打开 Git Bash,…...

基础篇:消息队列理论部分,另一种环境搭建Docker运行RabbitMQ

基础篇:消息队列理论部分,另一种环境搭建Docker运行RabbitMQ消息队列与RabbitMQ初探 本章学习目标理解什么是消息队列以及它解决了什么核心问题。了解RabbitMQ是什么及其在技术生态中的位置。另一种方式在本地使用Docker快速搭建一个RabbitMQ服务。熟悉RabbitMQ的管理控制台。…...

项目案例作业1:学生信息管理系统(面向对象初步接触)

集美大学课程实验报告-项目案例作业1:学生信息管理系统(面向对象初步接触)项目名称 内容课程名称 数据结构班级 网安2413指导教师 郑如滨学生姓名 林沁茹学号 202421336067实验项目名称 项目案例作业1:学生信息管理系统(面向对象初步接触)上机实践日期上机实践时间 2学时一…...

P1097 合唱队形

题目 做法:dp 代码: #include <bits/stdc++.h> using namespace std; int n,ans=-1; int s[1007]; int a[1007]; int b[1007]; int main(){cin >> n;for(int i=1;i<=n;i++){cin >> s[i];}for(int i=1;i<=n;i++){for(int j=0;j<i;j++){if(s[j]&l…...

一生一芯学习:pa2.1 RTFM

一生一芯学习:pa2.1 RTFM前面的内容后面再补,因为近期要C考核了,所以先准备下C考核所需的内容。 RTFSC(2) 整理一条指令在NEMU中的执行结果 从函数中跳转,宏嵌套中慢慢进入最终的代码,人肉gdb一下, 比如在sdb中执行一次si,那么根据cmd_si代码那我们会跳转到cpu_exec()中…...

Linux网络:初识网络 - 详解

Linux网络:初识网络 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-si…...

20250909比赛总结

T1 唐诗题目,维护最大与次大,就做完了,我边界错了(1为最有删除时不对),然后我加了一个1-100的暴力,就过了(浪费nan分钟) 下次写的时候多模拟边界,不要只关注后面的,而且只有打太久(>2h)就下一道...

又寸入生白勺司烤

我一直觉得,我们的人生就像一个凸包,时而高超,时而学习之。人类,一直在这样的高超和低谷下徘徊着,疑惑着,找寻着。那么,在低谷的时候,我们却让洛谷成为了人生的跳楼机,让我们反复升空又落地,这样一来,高超就更为容易了。但又会更快的降落,望着跳楼机窗外的暗红色的…...

Ubuntu 安装 GIPM

一行命令即可 sudo apt-get install gimp安装完后得到的软件:...

手动下载vscode扩展的方法

主要用于离线环境下安装。比如,要下载cpptools,可以使用以下url:https://marketplace.visualstudio.com/_apis/public/gallery/publishers/ms-vscode/vsextensions/cpptools/1.13.9/vspackage?targetPlatform=win32-x64在url中指定版本号和目标平台即可。目前支持的平台如下…...

GAS_Aura-Aura Projectile

1创建了一个火球Actor...

CF1583F Defender of Childhood Dreams

构造比较非人类。 先每 \(k\) 个点分一组,染上同一种颜色,再每 \(k^2\) 个点一组,组内染上同一种颜色,然后依次类推,发现满足条件,可以证明其下界是为 \(\log_k n\) 的。...

scrollArea无法滚动

问题本质 ScrollArea(如 Radix UI、shadcn/ui 等)无法滚动的根本原因是缺乏明确的高度约束。ScrollArea 需要知道自己的确切高度才能计算是否需要显示滚动条。 常见错误模式 // ❌ 错误:ScrollArea 无法获得明确高度 <div className="container"><Scroll…...

时间序列分析(1)

Time Series Problems and Challenges 时间序列问题和挑战 Time series data are a very important source of information. People always tried to analyze time series data to understand the nature of events. Since ancient times, mankind has begun to wonder what li…...

一行代码没写,做了一个小程序

我花了三天时间,准确地说应该是8个小时不到(因为期间《天龙八部》看到四十多回了,停不下来)做了一个微信小程序。 起因是和一个朋友聊到彩票,他说他都是攒好多张了之后,然后一起手动核对有没有中奖。当时我就萌生了做一个小程序的想法,扫一下就能知道是不是又做慈善了。…...

【置顶】欢迎来到 ziyaojia 的主页

这是 HN-CS 最菜的 OIer,你这个神犇敢和他对视 3 秒吗? 洛谷账号:ziyaojia...

copyparty 是一款使用单个 Python 材料实现的内网文件共享软件,具有跨平台、低资源占用等特点,适合需要本地化文件管理的场景

copyparty 是一款使用单个 Python 材料实现的内网文件共享软件,具有跨平台、低资源占用等特点,适合需要本地化文件管理的场景pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &quo…...

ZYNQ Ultrascale+系列部署yolo v10(暂定,若过于艰难则考虑降级或FQ)

YOLO V10模型分析与优化 2.1 YOLO V10模型获取与环境准备 步骤1:创建工作目录结构 # 打开终端,创建项目根目录 mkdir -p ~/yolo_v10_fpga_project cd ~/yolo_v10_fpga_project# 创建详细的目录结构 mkdir -p models/original # 存放原始模型 mkdir -p models/onnx …...

【EF Core】再谈普通实体关系与 Owned 关系的区别

在很多个世纪前,老周曾写过实体之间普通关系(一对一,一对多,多对多)与 Owned 关系的区别。不过,那次写得比较粗浅,逼格不够高,于是,老周厚着脸皮地决定重新写一下。 首先,为什么这次老周用原单词 Owned 呢,官方文档目前的翻译(怀疑是机器干的)为“从属”,这种说法…...

qoj6104 Building Bombing

题意 有 \(n\) 栋建筑,第 \(i\) 栋建筑的高度为 \(a_i\),一座建筑能从左侧看到仅当它左侧的建筑高度都小于它,问你最少需要爆破几座房子,才能使第 \(l\) 座房子成为能看到的第 \(k\) 高建筑。 \(n\le 10^5,k\le 10\)。 思路 首先 \(l\) 要能被看到,因此先把 \(l\) 左边高度…...

必知必会:使用serializers.Serializer在views.py视图文件中序列化和反序列化过程的开发模板

from django.views import Viewclass ProjectTestView(View):"""a.获取所有数据b.创建一条数据"""def get(self, request):"""序列化输出到前端的过程规则:a.创建模型对象b.将上面已创建好的的模型对象传递给序列化器类的instan…...

Cursor小程序实战五:Cursor对接微信两大核心问题

一、对话内容非技术人员的语言 程序员/技术人员的语言比如:回调地址,api,发送请求 ..... 二、微信的两大问题:授权、微信支付 目的是对于非技术人员能够输出一段比较精确的提示词,方便完成功能的开发 1)微信授权登陆 1、永远绕不开用户登陆流程用户登录 手机号验证码…...

电商系统的Mysql表设计是怎么样呢

一、前述 问题1: 电商系统创建订单的逻辑中,如果订单使用了优惠券的话,是会把优惠券直接标在订单表么,还是会单独创建一个表里记录订单和多个优惠券之间的关系 问题2: 如何设计一套mysql数据库的表,可以将订单信息、支付信息、优惠券信息以及商品信息之间关联起来二、实战演练…...

Docker应用 - CloudSaver

CloudSaver 是一个网盘搜索、转存工具。首次部署需要先注册用户,默认管理员注册码 230713。注册进入后可以在设置里修改管理员和用户注册码。用户配置处,可以登录多种网盘授权(可惜现在不支持百度了)。不设置也可以搜索,但不能直接转存。在常见问题可以查找搜索频道(密码…...

SQL查找是否存在,别再count了! - DAYTOY

根据某一条件从数据库表中查询 『有』与『没有』,只有两种状态,那为什么在写SQL的时候,还要SELECT count(*) 呢?无论是刚入道的程序员新星,还是精湛沙场多年的程序员老白,都是一如既往的count 1 目前多数人的写法 多次REVIEW代码时,发现如现现象:业务代码中,需要根据一…...

Cursor小程序实战系列二:如何从原型界面到小程序界面

一、原型界面的生成 在cursor中用以下提示词我想开发一个小程序 目标用户: • 主要用户:25-45岁的家长,没时间来教小孩怎么写作文,也可能不知道还在对应年级作文的写作规范和要求 • 用户痛点:1、家长难以针对孩子写作弱点提供定制化提升方案2、无法获得实时写作建议 我目…...

Cursor小程序实战系列三: 前后端对接保姆级拆解

一、先理解下什么是前后端,为什么叫对接? 二、谁来定义API接口 1、传统的模式 先后端出接口定义,前端人员按照接口定义自己搭建模拟数据,这样的好处是 前端,后端都能同时开发,互不影响 2、cursor模式 三、生成API接口文档 1、最好的方式,在rules中定义接口变化同时更新…...

课前问题思考2

1.方法相关问题 public class Main {static void changeStr(String x) {x = "xyz";}static void changeArr(String[] strs) {for (int i = 0; i < strs.length; i++) {strs[i] = strs[i]+""+i;}}public static void main(String[] args) { String x …...

Cursor小程序实战四:如何让AI写好后端代码

五、用好mermaid流程画图工具...

Web 3

Web 3 更改前题目 题目没有做记录,卡在了最后一步正则绕过,前七个绕过挺简单的 ?A[]=1&B[]=2&C=s878926199a&D[]=0&E=5201.1&F=0xDEADC0DE正则绕过: if (!preg_match(/ls|dir|nl|nc|cat|tail|more|flag|sh|cut|awk|strings|od|curl|ping|\*|sort|ch|zi…...

Cursor小程序实战系列一:0到1开发一个小程序,需求整理、小程序注册备案

一、需求的诞生 某书发表了一片笔记: 家长使用多维表格+DeepSeek对小孩进行作文辅导。痛点两到三个核心功能点这些内容对使用Cursor来生成页面很有帮助AI作文辅导一般的家长辅导孩子作文非常困难,主要原因如下:1、家长难以针对孩子写作弱点提供定制化提升方案 2、无法获得实时…...

深入解析:MySQL 数据类型与运算符详解

深入解析:MySQL 数据类型与运算符详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !importan…...

【前端Vue】如何优雅地在vue中引入ace-editor编辑器 - 指南

【前端Vue】如何优雅地在vue中引入ace-editor编辑器 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …...

USACO08 OPEN Roads Around the Farm S (递归)

(我太垃了,得写点题解提升一下) P2907 [USACO08OPEN] Roads Around The Farm S 题目描述 Farmer John 的奶牛对探索农场周围的领地产生了兴趣。最初,所有 $N$ 头奶牛($1 \leq N \leq 10^9$)以一个大群体的形式开始沿着一条道路旅行。当遇到岔路时,群体有时会选择分成两个…...

dubbo-go example学习记录

dubbo-go example仓库地址: https://github.com/apache/dubbo-go-samples你可以在 https://github.com/apache/dubbo-go-samples/blob/main/README_CN.md 查看中文的README文档快速上手 这个是通过 https://cn.dubbo.apache.org/zh-cn/blog/2021/01/14/快速上手-dubbo-go/ 官方…...

org.apache.commons.lang3.StringUtils工具类中 isEmpty 和 isBlank 的区别 - DAYTOY

1 isEmpty系列 1.1 StringUtils.isEmpty() 说明:是否为空. 可以看到 " " 空格是会绕过这种空判断,因为是一个空格,并不是严格的空值,会导致 isEmpty(" ")=falseStringUtils.isEmpty(null) = true StringUtils.isEmpty("") = true StringUtils.i…...