Java 和 Tesseract OCR 实现验证码识别

news/2025/2/5 23:27:15/文章来源:https://www.cnblogs.com/ocr12/p/18700319

验证码识别是自动化测试和爬虫开发中常见的任务之一。本文将介绍如何通过 Java 和 Tesseract OCR 实现验证码的自动识别,展示如何加载验证码图片、处理图像并进行文字识别。

  1. 环境准备
    安装 Tesseract OCR
    在开始之前,确保 Tesseract OCR 已安装:

Windows:从 Tesseract OCR 官网下载安装。
Linux:使用以下命令安装:
bash

sudo apt install tesseract-ocr
macOS:通过 Homebrew 安装:
bash

brew install tesseract
安装完成后,在终端中运行以下命令确认安装成功:

bash

tesseract --version
配置 Java 项目
为了使用 Tesseract OCR,我们需要引入 Tess4J,它是 Tesseract 的 Java 封装库。可以通过 Maven 引入 Tess4J:

Maven 依赖:

xml

net.sourceforge.tess4jtess4j5.4.0 2. 编写验证码识别代码 以下是一个简单的 Java 程序,用于加载图像并通过 Tesseract OCR 进行识别:

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) {// 指定验证码图片路径String imagePath = "captcha.png";// 初始化 Tesseract OCR 引擎ITesseract tesseract = new Tesseract();// 设置 Tesseract 数据路径(需要包含 tessdata 文件夹)tesseract.setDatapath("tessdata");// 设置语言为英文tesseract.setLanguage("eng");try {// 加载图像BufferedImage image = ImageIO.read(new File(imagePath));// 识别图像中的文字String result = tesseract.doOCR(image);// 输出识别结果System.out.println("识别的验证码是: " + result);} catch (TesseractException | IOException e) {System.err.println("识别失败: " + e.getMessage());}
}

}
3. 图像预处理
为了提高 OCR 的识别准确率,可以在识别之前对图像进行预处理。以下是一些常见的处理方法:

灰度化:将图像从彩色转换为灰度。
二值化:将图像转换为黑白,提高对比度。
去噪:移除背景噪点和干扰线条。
示例:在 Java 中处理图像
可以使用 java.awt 和 javax.imageio 提供的工具来对图像进行预处理:

java

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 = (color.getRed() + color.getGreen() + color.getBlue()) / 3;// 设置灰度值grayImage.setRGB(x, y, new Color(gray, gray, gray).getRGB());}}return grayImage;
}

}
将预处理方法集成到主程序中:

java

BufferedImage originalImage = ImageIO.read(new File(imagePath));
BufferedImage processedImage = ImagePreprocessor.preprocessImage(originalImage);

// 使用 Tesseract OCR 识别预处理后的图像
String result = tesseract.doOCR(processedImage);
4. 提高识别准确率
使用白名单过滤字符

如果验证码只包含数字或字母,可以通过设置字符白名单限制识别范围:
java

tesseract.setTessVariable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
调整页面分割模式

Tesseract 提供多种页面分割模式(PSM),可以根据验证码特点选择最合适的模式。例如:
java

tesseract.setPageSegMode(7); // 单行文本模式
拆分字符

对于包含多个字符的验证码,可以先将字符切割为独立的小图,再分别识别。
训练自定义模型

如果验证码的字体或风格较为特殊,可以通过训练 Tesseract 的自定义模型来提升识别效果。
5. 运行程序
将代码保存为 Java 文件(如 CaptchaRecognition.java),确保 tessdata 文件夹和验证码图片位于项目路径中。编译并运行程序:

bash

javac -cp .:tess4j.jar CaptchaRecognition.java
java -cp .:tess4j.jar CaptchaRecognition
程序运行成功后,将输出识别结果,例如:

makefile
更多内容访问ttocr.com或联系1436423940
识别的验证码是: AB9C7

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

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

相关文章

GNURadio模块学习——Source and Sink类

介绍GNU Radio中常见的 Source 与 Sink 模块,包括流程图端口、音频输入输出、虚拟连接、文件读写、ZMQ跨流程图通信,以及随机信号源、固定信号源、噪声源等常见信号源和时域、频域、星座图等信号展示工具。Source and Sink Pad(流程图端口) 当该流程图是hierarchical block…

【C++】gflag使用指南

一、什么是gflags? gflags 是一个用于定义命令行参数的 C++ 库,它由 Google 开发并开源。通过 gflags,你可以轻松地在你的程序中添加各种类型的命令行选项,包括整数、布尔值、字符串等,并且可以为这些选项设置默认值。此外,gflags 还提供了强大的帮助信息生成功能,使得用…

【C++】Google benchmark理解与应用

一、介绍 Google Benchmark 是一个用于 C++ 的微基准测试库。它旨在帮助开发者编写出更高效、更具表现力的基准测试代码。通过使用 Google Benchmark,可以方便地测量函数或代码片段的性能,并且能够生成详细的报告。 二、安装与配置 2.1 安装 在Ubuntu环境中安装Google Benchm…

LRU浅析

LRU算法LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t,当须淘汰一个页面时,选择现有页面中其 t 值最大的,即最近最少使…

20250205 省选模拟赛 T3

20250205 省选模拟赛 T3 Description 设计一个 \(n\times n\) 的 01 矩阵,使得从 \((1,1)\) 走到 \((n,n)\) 且只能向右或下走且只经过为 \(1\) 的格子的方案数为 \(X\)。 \(n \leq 24\) 时得满分。\(X \leq 10^9\)。 Solution 基于 \(2\) 进制的构造方法我们称从左上到右下的…

Automa:自动化浏览器工作流

🏷️仓库名称:AutomaApp/automa 🌟截止发稿星数: 14340 (今日新增:33) 🇨🇳仓库语言: Vue 🤝仓库开源协议:Other 🔗仓库地址:https://github.com/AutomaApp/automa引言 Automa是一个浏览器扩展,允许用户通过连接模块来自动化浏览器任务。它消除了重复性任务的需…

本地部署DeepSeek教程

本地部署DeepSeek教程 步骤 本地部署DeepSeek教程步骤 1 安装Ollama 2 下载DeepSeek模型 3 可视化图文交互界面Chatbox(可选)1 安装Ollama 访问Ollama官网下载Ollama,默认安装即可。安装完成后打开终端(我这里是windows系统),输入: ollama help即可查看ollama选项,且可…

OpenLDAP篇-安装OpenLDAP服务01

1、OpenLDAP统⼀⽤户认证系统 1.1 为什么需要OpenLDAP 在没有OpenLDAP统⼀⽤户认证系统的环境中,往往会⾯临如下问题:1、当⽤户需要访问多台服务器时,管理员需要在每台服务器上⼿动创建账户。如果员⼯离职,还需逐台删除账户,整体操作繁琐且容易出现遗漏的情况,因此存在较…

集训3 20240127

集训3 20240127 牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ A: 题目大意:给定 \(n\) ,两个人轮流可以使 \(n\) 减去一个任意小于它且与它互质的数,求最后甲能否取胜 #include<bits/stdc++.h>using namespace std;int main() {long long n;cin&g…

RocketMQ实战—4.消息零丢失的方案

大纲 1.全链路分析为什么用户支付完成后却没有收到红包 2.RocketMQ的事务消息机制实现发送消息零丢失 3.RocketMQ事务消息机制的底层实现原理 4.是否可以通过同步重试方案来代替事务消息方案来实现发送消息零丢失 5.使用RocketMQ事务消息的代码案例细节 6.同步刷盘+Raft协议同步…

qoj7301 AGC036D 题解

qoj7301 orz yxx 有一个很牛的状态设计 \(f_{i,j,0/1}\),\(0\) 为 \(a_{i-1}>a_i\),\(j\) 记录 \(a_{i-1}\) 的值,\(a_i\) 的值未定;\(1\) 为 \(a_{i-1}<a_i\),\(j\) 记录 \(a_i\) 的值 这样可以完美解决 \(a_{i-1}>a_i<a_{i+1}\) 的问题 转移和优化都是简单的…

【PyTorch】对比Torch和Numpy

该部分主要通过对比Torch和Numpy基础知识,方便大家了解PyTorch。Numpy是处理数据的模块,处理各种矩阵的形式来多核加速运算。 Torch自称为神经网络界的Numpy,因为它能将torch产生的tensor(张量)放在 GPU 中加速运算(前提是你有合适的 GPU),就像Numpy会把array放在CPU中…