Rust + Tesseract OCR 解析验证码

news/2025/3/25 20:50:17/文章来源:https://www.cnblogs.com/ocr12/p/18788371
  1. 环境准备
    1.1 安装 Rust
    如果尚未安装 Rust,可以使用 rustup 进行安装:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
然后检查安装是否成功:

rustc --version
1.2 安装 Tesseract OCR
在不同操作系统上安装 Tesseract:

Linux(Ubuntu/Debian):

sudo apt update
sudo apt install tesseract-ocr libtesseract-dev
macOS(使用 Homebrew):

brew install tesseract
Windows: 从 Tesseract 官方 GitHub 下载并安装。

然后,检查安装是否成功:

tesseract --version
1.3 添加 Rust OCR 依赖
在 Cargo.toml 中添加 tesseract-rs 依赖:

[dependencies]
tesseract = "0.7"
image = "0.24"
2. 代码实现
在 src/main.rs 中编写如下代码:

use image::{DynamicImage, GrayImage, Luma, imageops::FilterType};
use tesseract::Tesseract;
use std::path::Path;

/// 预处理图像(灰度化 + 二值化)
fn preprocess_image(image_path: &str) -> GrayImage {
let img = image::open(image_path).expect("无法打开图像文件");

// 转换为灰度图像
let gray = img.to_luma8();// 二值化处理(阈值设定为 128)
let binary = gray.map(|p| {if p[0] > 128 {Luma([255]) // 白色} else {Luma([0]) // 黑色}
});binary

}

/// 进行 OCR 识别
fn recognize_text(image_path: &str) -> String {
let processed_image = preprocess_image(image_path);

// 保存处理后的图像(可选)
let output_path = "processed_captcha.png";
processed_image.save(output_path).expect("无法保存图像");// 使用 Tesseract 进行 OCR 解析
let text = Tesseract::new(None, "eng").unwrap().set_image(output_path).recognize().unwrap();text

}

fn main() {
let image_path = "captcha.png"; // 你的验证码图像
let result = recognize_text(image_path);
println!("识别出的验证码: {}", result.trim());
}
3. 代码解析
3.1 预处理图像
灰度化:

let gray = img.to_luma8();
这将彩色图像转换为灰度图,去除颜色干扰。

二值化:

let binary = gray.map(|p| {
if p[0] > 128 {
Luma([255]) // 白色
} else {
Luma([0]) // 黑色
}
});
设置阈值(128),增强字符对比度,提高识别率。

3.2 OCR 解析
加载 Tesseract OCR:

let text = Tesseract::new(None, "eng")
这里我们设定 OCR 语言为 eng(英语)。

设定要识别的图像:

.set_image(output_path)
执行 OCR 解析:

.recognize()
识别图像中的文本,并返回结果。

  1. 运行 OCR 识别
    确保 captcha.png 存在于项目目录中,然后运行:

cargo run
你将在终端看到验证码的识别结果。

  1. 提高 OCR 识别率
    5.1 选择合适的 PSM 模式
    Tesseract 提供不同的 页面分割模式(PSM),针对验证码推荐使用 PSM 6(假设单行文本):

let text = Tesseract::new(None, "eng")
.unwrap()
.set_image(output_path)
.set_variable("tessedit_pageseg_mode", "6") // PSM 6
.recognize()
.unwrap();
5.2 进一步优化
去除噪点(可使用 OpenCV 进行形态学处理)

使用 Tesseract 训练数据(针对验证码字体训练模型)

字符分割(如果验证码字符粘连,可以进行字符拆分)

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

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

相关文章

编译原理第五次作业

2.2.1 1)S-> S S *-> S S + S *->a S + S *->a a + S *->a a + a * 2)3)L={由多个a,加号,乘号组成的后缀表达式} 2.2.2 1)L={0^n 1^n | n>=1} 2)L={由多个a,加号,减号组成的前缀表达式} 3)L={ε或任意排列,嵌套的括号} 4)L={ε或包含相同数量a,b的字符…

XN2025 集训记录 D2

我好想你们啊 . 我怀念高一啊 . 至少还有理由放任自己开心不是吗 .XN2025 集训记录 D2 又是摆烂的一天 , 感觉打模拟赛时候的自己和改题时的自己完全不是一个人 . 不过往好了想 , 至少足够的模拟赛量 , 意味着我的高效率时间虽然不多 , 但是还有 . 买了个usb转网线 , 破费 39.9…

基于对偶二次曲线的快速椭圆检测

利用对偶二次曲线可精确求解椭圆圆心坐标。1、对偶二次曲线原理 二次曲线也称圆锥曲线,其几何定义是一个平面与两个顶点相对的圆锥相交所产生的交线。通常二次曲线指的是点二次曲线,它是定义在曲线点上的方程。而在射影几何中,齐次点和齐次线存在着可以互换的二元关系,因此…

【程设の旅】Python速通作业三

这节课老师讲了Python的面向对象部分 速度比较快 但是结合前面cpp的大部分知识可以弄懂 最后一道题估计是py特性了 可以理解但是那两个函数不知道是什么鬼 01:运算符的实现 描述 程序填空class A:def __init__(self,x):self.x = x // 在此处补充你的代码 a,b,c = map(int,input…

C/C++开发文档和常用的输入方式汇总

前几天复习的几种输入方式和帮助文档C/C++开发文档获取 之前下载过应该开发文档,今天push到了Gitee上了。可以随时获取,链接字符串操作 C 字符串 | 菜鸟教程 输入输出【包含字符串】 C 输入 & 输出 | 菜鸟教程 #include<stdio.h> int main() {char s[20];int i = 0…

Eino overview

一段话总结 Eino 是基于Golang的大模型应用开发框架,通过组件抽象(如ChatModel、Tool、Retriever)和图编排能力(Chain/Graph/Workflow)简化LLM应用开发。其核心优势包括类型安全的流处理、并发管理、切面注入以及开箱即用的最佳实践,支持构建复杂智能体(如ReAct)和多模…

llm 量化技术综述

综述: LLM 量化 1. Intro 低比特量化主要是减少tensor的bit-width,可以有效减少内存以及计算需求;主要可以压缩权重, 激活值, 和梯度,使得可以在受限资源的设备上使用。 2. 低比特LLM的基础 在这一届,我们主要引入从以下三个方面讨论:low-bit 数值格式 量化粒度 动态或者静…

Top 出海 AI 公司招技术!HIX.AI Pollo.ai | 深圳

HIX.AI & Pollo.ai 招聘高级海外 AI 产品经理 (25-45K) 岗位职责:负责Web 端海外 AI 产品的规划与策划,负责产品需求分析及原型设计,并制定方案推动产品研发落地; 进行产品/竞品调研,了解用户需求,分析、发现需求本质,并给出对应的解决方案; 有效对接开发、测试、运…

2、切片

一:字符串的下标(索引)--重点 ​ Ⅰ:字符串的特性,被称为下标或者 sequence(序列) ​ Ⅱ:一个序列。若干元素组成 ​ Ⅲ:字符串的下标从0开始》标记每个元素的位置,用来获取元素》从左到右,从0开始> a[0],a[1] ,a[3]》可以用正数表示,也可以用负数表示》最…

WEBGL 学习使用代码

目录杂七杂八第一节 绘制出了一个点第二节 动态传递点数据第三节 缓冲区和画线第四节 彩色线段第五节 单个 buffer 渲染颜色第六节 抽离代码 & 画彩色三角形第七节 图元的七种绘制方式第八节 uniform 传值变换数据第九节 旋转矩阵三角函数矩阵的计算推导代码实现第十节 线框…

Kettle 版本这么多,到底该怎么选?

Kettle(Pentaho Data Integration)作为一款功能强大的开源 ETL(Extract, Transform, Load,即数据抽取、转换和加载)工具,拥有众多版本,这让许多用户在选择时犯了难。 1、提出问题 经常有群友提出使用kettle版本的问题,如下图所示:2、kettle版本 有许多的的历史版本,…