用 Java 和 Tesseract 进行验证码识别:基础实现与优化

news/2025/9/24 19:54:40/文章来源:https://www.cnblogs.com/ocr12/p/19109861

验证码(CAPTCHA)是防止自动化攻击的常见手段。然而,在某些场景下,如自动化测试或者爬虫平台,可能需要识别和处理验证码图像。本文将指导你如何使用 Java 和 Tesseract OCR(光学字符识别)库来实现验证码识别,并提供一些优化建议。

🧰 环境准备

安装 Java 和 Maven:
确保 Java 和 Maven 已经安装好。可以通过命令行检查 Java 和 Maven 版本:

java -version
mvn -v
更多内容访问ttocr.com或联系1436423940

安装 Tesseract OCR:
Tesseract 是开源的 OCR 引擎,用于提取图像中的文本。

Windows 用户: 下载并安装 Tesseract,配置环境变量。

Linux 用户(Ubuntu):

sudo apt install tesseract-ocr

macOS 用户:

brew install tesseract

添加 Maven 依赖:

在你的 pom.xml 中添加以下依赖来使用 Tesseract:

net.sourceforge.tess4jtess4j5.4.0

🧩 核心代码实现

  1. 创建 OCR 服务
    import net.sourceforge.tess4j.*;
    import java.awt.image.BufferedImage;
    import javax.imageio.ImageIO;
    import java.io.File;
    import java.io.IOException;

public class OcrService {

public static String recognizeCaptcha(File imageFile) {ITesseract instance = new Tesseract();instance.setDatapath("tessdata");  // Tesseract OCR 数据路径instance.setLanguage("eng");        // 选择语言instance.setTessVariable("tessedit_pageseg_mode", "6");  // 单行文本模式try {BufferedImage image = ImageIO.read(imageFile);  // 读取图片文件return instance.doOCR(image).trim();            // 执行 OCR 识别} catch (TesseractException | IOException e) {e.printStackTrace();return "识别失败";}
}

}

  1. 创建控制器接口
    import org.springframework.web.bind.annotation.*;
    import org.springframework.web.multipart.MultipartFile;

import java.io.File;

@RestController
@RequestMapping("/captcha")
public class CaptchaController {

@PostMapping("/recognize")
public String recognizeCaptcha(@RequestParam("file") MultipartFile file) throws Exception {// 临时保存文件File tempFile = File.createTempFile("captcha_", ".png");file.transferTo(tempFile);// 调用 OCR 服务进行识别String result = OcrService.recognizeCaptcha(tempFile);// 删除临时文件tempFile.delete();return "识别结果: " + result;
}

}

🛠️ 图像预处理提升识别准确度

在某些情况下,验证码图像包含噪点或较低的对比度,直接进行 OCR 识别可能不够理想。你可以对图像进行预处理来提升识别准确性。

  1. 灰度化与二值化处理
    import java.awt.Color;
    import java.awt.image.BufferedImage;

public class ImagePreprocessor {

public static BufferedImage preprocessImage(BufferedImage image) {// 灰度化处理BufferedImage grayImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_BYTE_GRAY);for (int x = 0; x < image.getWidth(); x++) {for (int y = 0; y < image.getHeight(); y++) {Color color = new Color(image.getRGB(x, y));int gray = (int)(0.3 * color.getRed() + 0.59 * color.getGreen() + 0.11 * color.getBlue());grayImage.setRGB(x, y, new Color(gray, gray, gray).getRGB());}}// 二值化处理BufferedImage binaryImage = 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++) {int rgb = grayImage.getRGB(x, y);int value = rgb == Color.BLACK.getRGB() ? 0 : 255;binaryImage.setRGB(x, y, new Color(value, value, value).getRGB());}}return binaryImage;
}

}

  1. 在 OcrService 中集成图像预处理
    public static String recognizeCaptcha(File imageFile) {
    ITesseract instance = new Tesseract();
    instance.setDatapath("tessdata");
    instance.setLanguage("eng");
    instance.setTessVariable("tessedit_pageseg_mode", "6");

    try {
    BufferedImage image = ImageIO.read(imageFile);
    BufferedImage processedImage = ImagePreprocessor.preprocessImage(image); // 预处理图像
    return instance.doOCR(processedImage).trim(); // 执行 OCR
    } catch (TesseractException | IOException e) {
    e.printStackTrace();
    return "识别失败";
    }
    }

📈 提升识别率的其他方法

训练自定义语言模型:
如果你的验证码中包含特定字体或字符,可以通过训练 Tesseract 来识别特定类型的验证码。你可以通过 Tesseract 提供的训练工具自定义语言模型。

调整 tessedit_pageseg_mode:
Tesseract 提供了多个页面分割模式(PSM)。例如,如果验证码是单行文本,使用 tessedit_pageseg_mode=6 可以提高识别准确率。

去噪声与字符分割:
如果验证码字符之间存在粘连或噪声,可以使用图像处理技术(如高斯模糊或形态学运算)对图像进行进一步清理。

使用深度学习模型:
如果 Tesseract 无法满足需求,可以考虑基于深度学习的 OCR 方案,如 EasyOCR 或 PaddleOCR,它们在复杂验证码识别中通常能提供更好的准确度。

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

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

相关文章

新网站应该怎么做料神wordpress建站教程

A12435 思路&#xff1a;只有4中情况:A1,A2翻转&#xff0c;其他正常&#xff0c;A2A3翻转其他正常.....为了下标与数字对应我开了6个空间&#xff0c;然后从1开始循环&#xff0c;到4截止&#xff0c;因为循环中有i1害怕数组越界&#xff0c;如果索引出的数与下标不相等了&…

教育类网站开发文档上海工程项目查询

仓库建设 luogu 2120 题目大意 有一个斜坡&#xff0c;上面有n个工厂&#xff08;山顶是1&#xff0c;山脚是nnn&#xff0c;工厂都是漏填&#xff09;&#xff0c;上面有pip_ipi​个货物&#xff0c;和工厂1的距离为x1x_1x1​ 现在有一场大雨&#xff0c;你可以在某些工厂处…

网站开发项目工期流程手机版网页

BERT&#xff1a;深度学习领域中的语言理解利器 摘要 BERT&#xff08;双向编码器表示法自转换器&#xff09;是一种领先的深度学习模型&#xff0c;它在许多语言理解任务中都显示出卓越的性能。BERT模型基于转换器编码器架构&#xff0c;并通过自监督学习在大量未标记文本数…

Java第二次实验

1. 本章学习总结 本章学习了Java多方面知识:控制台输入推荐用Scanner.nextLine()避免问题,还涉及 IDE 操作与 String.split;身份证排序用Arrays.sort和String.subString,结构化编程且注意输入方法;需了解 StringB…

详细介绍:【2025PolarCTF秋季个人赛】WEB方向wp

详细介绍:【2025PolarCTF秋季个人赛】WEB方向wppre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", …

英语_阅读

当然可以,以下是英文与中文交替的逐句翻译:Six-year-old Brooke Neitzel wanted a dollhouse. 六岁的布鲁克奈策尔想要一个娃娃屋。 So she ordered one just by telling the familys smart speaker what she wanted…

Nuget安装以及西门子PLC通信

安装S7NetPlus库 ​添加命名空间 ,using S7.Net​创建一个西门子PLC通信对象——成员变量实例化 ,this:表示的是当前对象建立简介 ,对象名.方法名 , this.siemens.Open()​读取变量 , 装箱的一个过程 ,解析变量 ,…

wordpress捐赠按钮如何做网站导航栏的seo优化

2.1.9 调度算法 知识总览 学习各种调度算法的思路 算法思想算法规则这种调度算法是用于作业调度还是进程调度&#xff1f;抢占式或是非抢占式优点和缺点是否会导致饥饿&#xff08;某进程/作业长期得不到服务&#xff09; 2.1.9.1 先来先服务 知识点说明英文名FCFS&#xff0…

网站怎么做成二维码做网站找顺的

二叉树垂直遍历题目描述输入输出示例输入实例输出DFSBFS更简单的方法二叉树垂直遍历题目描述对于一个二叉树&#xff0c;输出它的垂直遍历结果&#xff1b;对于同一列的节点&#xff0c;按照从左向右&#xff0c;从上向下的顺序排列。例如&#xff0c;对于以下二叉树&#xff1…

与狗狗做网站互联网广告价格

创建工程&#xff1a; 2.1.程序的耦合 耦合&#xff1a;耦合指的就是对象之间的依赖关系。对象之间的耦合越高&#xff0c;维护成本越高。 案例&#xff1a;没有引入IOC容器时系统的Web层、业务层、持久层存在耦合 /*** 持久层实现类*/ public class UserDaoImpl implements U…

每日反思(2025_09_24)

今天跟着左神视频学些了快速排序以及逆序对和荷兰国旗问题,了解了双指针三指针递归解决问题,并解决了leetcode第75题颜色分类,正在解决力扣LCR170题。 明天继续跟视频学习,并写涉及到的力扣题,晚上总结这三天的学…

普通用户之间免密互信时因权限问题致使配置失败

[student@master ~]$ ssh-copy-id user1@node1 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/student/.ssh/id_rsa.pub" /usr/bin/ssh-copy-id: INFO: attempting to log in with…

安装Flask库

安装Flask库 1、下载安装python官网下载 python-3.9.10-amd64.exe 安装,勾选Add Python 3.9 to PATH 2、验证安装cmd输入:python --version cmd输入:pip --version 升级pip:python -m pip install --upgrade pip …

《新概念英语》在线朗读,单句点读,随时随地在线学习。

新概念英语-全四册 New Concept English 在线课文点读 在线朗读,单句点读,随时随地在线学习。📕 第一册:《First Things First》 目标:打基础,日常交流入门内容概述:共144课,都是非常短的小对话和故事。 涉及…

深入解析:[p2p-Magnet] docs | HTTP API与Web界面 | 搜索查询引擎

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

南京网站制作学校怎么注册一个网站

戳蓝字“CSDN云计算”关注我们哦&#xff01; 文 | 阿晶、丹丹、王银发于上海华为HC大会现场出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09; 科技的不断发展正逐步加速智能世界的到来。一直&#xff0c;华为致力于提供经济且充裕的算力&#xff0c;力图像使…

为什么用MyEclipse做网站ps如何做音乐网站

观察者模式是一种设计模式&#xff0c;其中一个对象&#xff08;称为主题&#xff09;维护一组依赖于它的对象&#xff08;称为观察者&#xff09;&#xff0c;当主题的状态发生变化时&#xff0c;它会通知所有观察者。这种模式常用于实现分布式事件处理系统。 下面是一个简单…

如何做分类网站信息营销网站设计的内容有哪些

学习网络开发过程中不想“污染”macOS&#xff0c;考虑到之后部署网络应用主要是与linux打交道&#xff0c;所以安装了 ubuntu 虚拟机以满足短期的知识学习需求。十里安装了 ubuntu 虚拟机&#xff0c;一般就是在 mac 中 ssh 连接 ubuntu 虚拟机在终端下进行操作学习&#xff0…

P10004 [集训队互测 2023] Permutation Counting 2

把排列写成一条路径 \(p_1\to p_2\to\cdots\to p_n\)。那么 \([p_i<p_{i+1}]\) 就是第 \(i\) 步往右走,\([p^{-1}_i<p^{-1}_{i+1}]\) 是 \(i\) 要先于 \(i+1\) 访问。 如果我们已知了 \(p^{-1}_{i}<p^{-1}_{…

java数组拷贝主要有四种方法,浅拷贝

java数组拷贝主要有四种方法,浅拷贝java数组拷贝主要有四种方法,浅拷贝 在Java中,数组拷贝可以通过多种方式实现,每种方式有其特定的用途和性能特点。下面列举四种常见的方法: 1. 使用System.arraycopy() System.…