Rust 解析验证码:结合 Tesseract OCR 进行文本识别

news/2025/10/30 23:32:08/文章来源:https://www.cnblogs.com/ocr12/p/19178366
  1. 环境准备
    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
Linux(Ubuntu)
sudo apt update
sudo apt install tesseract-ocr libtesseract-dev

macOS(Homebrew)
brew install tesseract

Windows

从 Tesseract GitHub
下载并安装。

检查 Tesseract 是否安装成功:

tesseract --version

  1. 创建 Rust 项目

使用 Cargo 创建新项目:

cargo new captcha_reader
cd captcha_reader

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

[dependencies]
tesseract = "0.14"
image = "0.24" # 用于处理验证码图片

  1. 代码实现

修改 src/main.rs,写入以下代码:

use std::process::Command;
use image::{DynamicImage, GenericImageView, GrayImage, Luma};
use tesseract::Tesseract;

fn preprocess_image(input_path: &str, output_path: &str) {
let img = image::open(input_path).expect("无法打开图片");
let gray_img = img.to_luma8(); // 转换为灰度图像

// 二值化处理
let binary_img = GrayImage::from_fn(gray_img.width(), gray_img.height(), |x, y| {if gray_img.get_pixel(x, y)[0] > 128 {Luma([255]) // 白色} else {Luma([0]) // 黑色}
});binary_img.save(output_path).expect("无法保存处理后的图片");

}

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

// 预处理图片
preprocess_image(input_image, processed_image);// 使用 Tesseract OCR 解析验证码
let text = Tesseract::new(None, "eng").expect("无法初始化 Tesseract").set_image(processed_image).recognize().expect("OCR 失败");println!("识别出的验证码: {}", text.trim());

}

  1. 代码解析
    4.1 图像预处理
    fn preprocess_image(input_path: &str, output_path: &str)

读取验证码图像,转换为灰度图像,并进行二值化处理,以提高 OCR 识别率。

4.2 OCR 识别
let text = Tesseract::new(None, "eng")
.expect("无法初始化 Tesseract")
.set_image(processed_image)
.recognize()
.expect("OCR 失败");

调用 Tesseract 进行验证码解析。

4.3 输出识别结果
println!("识别出的验证码: {}", text.trim());

去除空格,输出 OCR 识别结果。

  1. 运行程序

将 captcha.png 图片放入项目目录,然后运行:

cargo run

示例输出:

识别出的验证码: X7G9H

  1. 提高 OCR 识别率
    6.1 选择不同的 Tesseract PSM 模式
    let text = Tesseract::new(None, "eng")
    .expect("无法初始化 Tesseract")
    .set_variable("tessedit_pageseg_mode", "6") // 单行文本模式
    .set_image(processed_image)
    .recognize()
    .expect("OCR 失败");

6.2 限制识别字符集
let text = Tesseract::new(None, "eng")
.expect("无法初始化 Tesseract")
.set_variable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ")
.set_image(processed_image)
.recognize()
.expect("OCR 失败");

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

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

相关文章

UML图以及设计模式部分总结

今天将软考内容中的UML统一建模语言和设计模式的部分内容进行了复习,具体内容总结如下: 1.类图,用例图,序列图,通信图,状态图:状态图强调一个对象行为的事件顺序,包括初态中间态以及终态, 初态只有一个,而终…

Consul访问宿主机api项目失败 - binzi

最近在学习consul,在docker上启动consul实例后。本地有一个.net core api项目,项目主要是实现启动就向consul注册及有一个心跳检查,启动调试后可以看到已经成功向consul注册了服务,就是心跳检查一直不成功,最后不…

读《代码大全2》第一章有感

读《代码大全2》第一章有感以前总觉得代码能跑起来就行,读了《代码大全2》第一章才发现,好代码远不止于此。可读性、可维护性才是关键,那些随意的命名和缺失的注释,其实都是后续的麻烦。新手入门,先把规范记牢准没…

251030

251030寒冷的夜里,如果不是有特别的理由没人会待在街上,大家都有不惜牺牲自己也要得到的东西,这种感觉就像是费劲千辛万苦地蒸发自己,让自己动起来去触碰不动的东西,所以视觉是很宝贵的,但听觉却是多余的,聋哑真…

FOC学习

FOC学习 无刷电机的定子有 3 组绕组(U、V、W),转子是永磁体。六步换向的核心是 “按转子位置给对应绕组通电”,而位置检测全靠电机内置的 3 个霍尔传感器(互差 120 电气角)。3 个霍尔传感器组合起来,每旋转一圈…

软件技术第二次作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/zjlg/25rjjc 这个作业的目标:实现一个命令行文本计数统计程序,能正确统计导入的纯英文txt文本中的字符数,单词数,句子数。 姓名 学号 万绮梦 2023339915012 …

前端三剑客——javascript流程控制与异常处理

大纲 :1.判断语句/分支语句:if else if elseswitch case2.循环语句/遍历语句whilefor循环/for遍历3.补充:forEach(数组的内置方法)4.异常处理和主动抛出异常5.时间相关判断语句/分支语句1.if else 和 if else…

《代码大全2》-观后感-一本可以陪伴整个职业生涯的“案头书”

现在读不懂全部,但未来一定会感谢现在翻开它的自己 坦白说,以我目前大二的知识储备和项目经验,《代码大全2》里的某些章节,比如关于系统考虑、软件架构的部分,我读起来还有些吃力,感觉像是在看“天书”。它们所描…

Android Tor浏览器缩略图取证技术解析

本文详细介绍了在Android设备上定位Tor浏览器标签页缩略图的技术方法,包括文件路径、格式解析和取证工具使用,为数字取证调查提供了新的技术突破。Android Tor浏览器缩略图取证技术解析 Tor浏览器调查通常仅限于用户…

串口打印彩色log

单片机开发中串口日志的打印极大方便了我的调试工作,随着日志数据的增加又带来新的问题:短时间吐出的大量数据实在是让人眼花缭乱。 如何在大量数据中一眼找到重点成为我今天的课题。如果在终端中能以不同颜色甚至不…

洛必达法则

洛必达法则:若 \(f(x)\) 在 \(a\) 附近可导,\(g(x)\) 在 \(a\) 附近可导,且 \(f(a) = 0,g(a) = 0\) 或 \(f(a) = \infty,g(a) = \infty\),则有: \[\lim_{x\to a}\dfrac{f(x)}{g(x)} = \lim_{x\to a}\dfrac{f(x)}{…

2025平航杯

计算机取证 计算机取证-1 可以直接找到计算机取证-2 直接翻所以是5 计算机取证-3这里可以看出来使用Edge浏览器记录最多 可以推断Edge是默认浏览器 计算机取证-4在Edge里面发现了 计算机取证-5开关机时间里面可以找到 …

第七天第四天7.4

所用时间:405分钟 代码量(行):352 了解到的知识点: 1.企业岗位招聘调查 字节跳动技术岗招聘流程呈现“标准化、高门槛、重实战”的特点,网申阶段强调岗位匹配度,笔试聚焦基础与解题能力,面试通过多轮分层评估技…

第七周第三天7.3

所用时间:90分钟 代码量(行):112 了解到的知识点:

Linux提权基础

Linux提权基础 Linux 用户和用户组 用户和用户组的概念: 在 Linux 系统中,用户(User) 和用户组(Group) 是实现 “多用户权限管理” 的核心机制,目的是隔离不同操作者的资源访问范围,保证系统安全和有序运行。简…

2025年有实力的GEO优化公司TOP10排行榜:GEO系统、GEO优化排名、GEO优化排名软件公司优选

在当今数字化营销浪潮中,全域GEO搜索排名推广系统等相关产品成为企业提升品牌曝光度、拓展客户群体的关键利器。山东地标数字科技有限公司作为行业佼佼者,在这一领域展现出独特的魅力与实力。然而,不少企业在营销之…

rust学习(一)Windows安装rust环境

Windows下安装Rust考虑到默认安装目录以及文件下载速度,可以提前设置好环境变量1.配置环境变量信息RUSTUP_DIST_SERVER RUSTUP_UPDATE_ROOT RUSTUP_HOME 默认安装位置为C:\User\[用户名]\.rustup CARGO_HOME默认安装位…

第一次小测复习

switch(x) 中的 x 可以是 ** 整型** 或者 字符型 。(PPT里面的整数类型大致是包含这两个吧) 注意 D 是十六进制的 13,`D` 是字符。 看 for 之类的较为复杂的循环时,不要想当然,每一步都要认真验算! 尤其是循环嵌…

10月30日

今完成了MES管理系统的开发实践,深入理解了生产管理系统的业务逻辑和技术实现。通过Servlet和JSP的配合使用,掌握了Web应用的基本架构模式。在开发过程中,特别注重数据验证的重要性,包括生产批次的10位数字格式验证…