Rust 解析验证码(结合 Tesseract OCR)

news/2025/11/15 23:52:39/文章来源:https://www.cnblogs.com/ocr12/p/19226556

环境准备
1.1 安装 Rust
如果尚未安装 Rust,可以使用官方推荐的 rustup 进行安装:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

更多内容访问ttocr.com或联系1436423940
然后检查 Rust 版本:

rustc --version

1.2 安装 Tesseract OCR
macOS(Homebrew 安装)
brew install tesseract

Linux(Ubuntu 示例)
sudo apt update
sudo apt install tesseract-ocr -y

Windows

Windows 用户可以从 Tesseract 官方 GitHub
下载并安装 Tesseract,并配置环境变量。

检查 Tesseract 是否安装成功:

tesseract --version

1.3 创建 Rust 项目

创建一个新的 Rust 项目:

cargo new rust_ocr
cd rust_ocr

然后,在 Cargo.toml 中添加 Tesseract 相关依赖:

[dependencies]
tesseract = "0.13"
image = "0.24"

运行:

cargo build

代码实现
编辑 src/main.rs,写入以下代码:

use std::fs::File;
use std::path::Path;
use image::{GrayImage, Luma, DynamicImage, GenericImageView};
use tesseract::Tesseract;

fn preprocess_image(input_path: &str, output_path: &str) {
let img = image::open(input_path).expect("无法打开图片");

// 转换为灰度图像
let gray_img = img.into_luma8();

// 二值化处理
let mut binary_img = gray_img.clone();
for pixel in binary_img.pixels_mut() {
if pixel[0] > 128 {
*pixel = Luma([255]); // 白色
} else {
*pixel = Luma([0]); // 黑色
}
}

// 保存处理后的图像
binary_img.save(output_path).expect("无法保存处理后的图像");
}

fn recognize_captcha(image_path: &str) -> String {
let mut tess = Tesseract::new(None, "eng").expect("无法初始化 Tesseract");
tess.set_image(image_path);
tess.set_variable("tessedit_pageseg_mode", "6").unwrap(); // PSM 6 适用于验证码
tess.recognize().expect("OCR 识别失败");
tess.get_text().unwrap_or_else(|_| "识别失败".to_string())
}

fn main() {
let input_image = "captcha.png"; // 你的验证码图片路径
let processed_image = "processed_captcha.png";

// 预处理验证码图像
preprocess_image(input_image, processed_image);

// OCR 识别
let result = recognize_captcha(processed_image);
println!("识别出的验证码: {}", result);
}

代码解析
3.1 图像预处理
为了提高 OCR 识别率,我们对验证码进行了优化:

转换为灰度图像:

let gray_img = img.into_luma8();

二值化处理(增强对比度):

for pixel in binary_img.pixels_mut() {
if pixel[0] > 128 {
*pixel = Luma([255]); // 白色
} else {
*pixel = Luma([0]); // 黑色
}
}

保存处理后的图像:

binary_img.save(output_path).expect("无法保存处理后的图像");

3.2 OCR 解析

初始化 Tesseract OCR:

let mut tess = Tesseract::new(None, "eng").expect("无法初始化 Tesseract");

设置 OCR 识别模式(PSM 6 适用于验证码):

tess.set_variable("tessedit_pageseg_mode", "6").unwrap();

加载验证码图像并执行 OCR 识别:

tess.set_image(image_path);
tess.recognize().expect("OCR 识别失败");

获取识别结果:

tess.get_text().unwrap_or_else(|_| "识别失败".to_string())

运行程序
确保 captcha.png 存在于项目目录,然后运行:

cargo run

示例输出:

识别出的验证码: X9GH5

提高 OCR 识别率
5.1 选择合适的 PSM 模式
Tesseract 提供了不同的页面分割模式:

tess.set_variable("tessedit_pageseg_mode", "10").unwrap(); // 识别单个字符

PSM 6:假设是单行文本(默认推荐)

PSM 7:只检测单个文本行

PSM 10:单个字符模式(适用于单字符验证码)

5.2 只识别特定字符

如果验证码仅包含字母和数字:

tess.set_variable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ").unwrap();

5.3 进一步优化

降噪处理:可以使用 OpenCV for Rust 进行去噪优化

字符分割:如果验证码字符粘连,可尝试 OpenCV 进行字符分割

使用深度学习:如果 Tesseract 不能满足需求,可以结合 Rust TensorFlow 或 PyTorch Rust 进行训练,提高验证码识别成功率

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

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

相关文章

django-approval-workflow

django-approval-workflow https://github.com/Codxi-Co/django-approval-workflow A powerful, flexible, and reusable Django package for implementing dynamic multi-step approval workflows in your Django app…

Go 语言实现简单的文字识别(OCR)

随着人工智能技术的迅猛发展,文字识别(OCR,Optical Character Recognition)已经广泛应用于文档扫描、自动化数据输入等领域。在这篇文章中,我们将通过 Go 语言实现一个简单的文字识别程序,来提取图片中的文字。为…

『回忆录』高二上半期考试

上文:第一次月考。 现在是尚未出分的版本。 月回顾 从上次 1004 开始写,那天晚上也是开始疯狂回忆过去。 然后就是国庆强基三天自习一天。引流:国庆强基 中途 1006 那天晚上前两节课是生日会和中秋节。其中听歌识曲…

多项式牛顿迭代

【前置知识】泰勒展开。设 \(g\) 是一个光滑的函数,\(g(y)=\sum_{n\ge 0} \frac{g^{n}(y_0)}{n!}(y-y_0)^n\).多项式 exp。 给定多项式 \(a(x)\) 满足 \(a_0=0\),求 \(\exp a(x)\bmod x^n\)。 设 \(\exp a(x)=f(x)\)…

轮胎内喷涂优惠工具趋势分析报告

在轮胎制造与橡胶制品生产过程中,如何精准匹配工艺需求与材料性能,始终是行业采购决策中的核心难点。面对市面上琳琅满目的轮胎内喷涂、胶囊隔离剂、胶片隔离剂等产品,用户常因参数混乱、功能描述模糊或缺乏本地化适…

Vibe coding All In One

Vibe coding All In One Vibe coding is an artificial intelligence-assisted software development technique popularized by Andrej Karpathy in February 2025. It was named Collins Dictionarys Word of the Ye…

路径计数与反射容斥

【路径计数模型】 【卡特兰数】 组合意义:从 \((0,0)\) 走到 \((n,n)\),每次向右或者向上,不严格越过对角线的方案数。 它也和长度为 \(2n\) 的合法括号序列个数相等。各种问题都可以转化为卡特兰数。 回忆一下卡特…

多项式复合逆与拉格朗日反演

【定义】 对两多项式 \(f,g\),无常数项且一次项系数非 \(0\),有:\(f(g(x))=x\iff g(f(x))=x\)。(这个结论需要用到高深的群论知识,不会) 如果 \(f(g(x))=x\),称 \(f,g\) 互为复合逆。记 \(f^{-1}\) 为 \(f\) 的…

Day21浮动

1.浮动的基本使用 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-sc…

KEYDIY KD B12-3 3-Button Ford Flip Key Remote - 5pcs/lot (Replacement for Ford Vehicles)

## Problem: Key Replacements for Ford Vehicles – A Costly and Time-Consuming Hassle For European and American automotive repair shops and Ford vehicle owners, replacing lost or damaged keys can feel l…

Spring AI Alibaba 项目源码学习(七)-Agent、BaseAgent、ReactAgent 分析

Agent、BaseAgent、ReactAgent 分析 请关注微信公众号:阿呆-bot 概述 本文档分析 Spring AI Alibaba Agent Framework 中的核心 Agent 类层次结构,包括 Agent 基类、BaseAgent 抽象类和 ReactAgent 具体实现,重点分…

AtCoder Beginner Contest 432 ABCDEG 题目解析

A - Permute to Maximize 题意 给定三个个位数 \(A,B,C\)。 请找出将 \(A,B,C\) 按任意顺序排列并连接起来可以形成的所有三位数中的最大值。 思路 贪心可知,当数字长度一定时,可以优先让高位更大。因此对三个正整数…

fireworks

fireworks https://github.com/materialsproject/fireworks FireWorks stores, executes, and manages calculation workflows.Website (including documentation): https://materialsproject.github.io/fireworks/ He…

KEYDIY KD ZB28-3 Universal Hyundai Smart Remote Key (5pcs/lot) – Reliable Replacement

## Hyundai Smart Key Woes? Meet the KEYDIY KD ZB28-3 Universal Solution ### Problem: The Frustration of Hyundai Smart Key Replacement When a Hyundai owner’s smart remote key fails, or a mechanic need…

Yanhua Mini ACDP-2 A303 Volvo 2022+ IMMO License for ACDP-2 Module20

**Tackling Modern Volvo IMMO Challenges: The Yanhua Mini ACDP-2 A303 License** Modern Volvo vehicles (2022 and newer) are equipped with advanced Immobilizer (IMMO) systems designed to enhance security.…

西电TIC带鱼杯新生训练赛复盘

传送门 A 最大子树和 P1122 最大子树和 - 洛谷几天前看过一眼,大概知道思路,但是因为忘记ans可能取负而没有一次切掉分析题目要求一个节点带权的树的最大子树和我们用 f [ i ]记录子树以节点 i 为根节点时的最大子树…

20251115 - 从零到1详细剖析STM32的CAN架构【以STM32F407为例】

从零到1详细剖析STM32的CAN架构【以STM32F407为例】 1 概览:bxCAN 在 STM32F407 中的位置与作用bxCAN(Basic extended CAN) 是 STM32F4 系列内部实现的 CAN 控制器硬件 IP,用来在物理 CAN 差分总线上收/发 CAN 帧(…

2025.11.15 测试

2025.11.15 测试改题 策略 7:10 顺序开题 T1 随便猜了个结论然后不小心过了大杨利,还好这种题我有经验,没有被吓到 7:49 写完 full_speed 说这个是模板快速读入 因为他写快读但没用,T 到 35pt。。。 T2 额,一眼数…

鸿蒙应用审核被拒?常见原因与避坑指南来了

一个个精心开发的应用,却总在审核关卡折戟,问题究竟出在哪里?鸿蒙生态正迎来前所未有的爆发期。数据显示,HarmonyOS 5 终端数已突破 2300 万,鸿蒙开发者数量超过 800 万,上架应用及元服务超过 3 万款。 在“鸿蒙…

C++篇(13)计算器实现 - 指南

C++篇(13)计算器实现 - 指南2025-11-15 22:58 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !importan…