用 Rust 结合 Tesseract OCR 解析验证码

news/2025/3/13 23:12:31/文章来源:https://www.cnblogs.com/ocr12/p/18771230
  1. 环境准备
    1.1 安装 Rust
    Rust 采用 Rustup 进行管理,可以通过以下命令安装:

bash

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
安装完成后,检查版本:

bash

rustc --version
1.2 安装 Tesseract OCR
使用 包管理器 安装 Tesseract:

macOS(Homebrew):
bash

brew install tesseract
Ubuntu/Debian:
bash

sudo apt update
sudo apt install tesseract-ocr libtesseract-dev
Windows(Scoop):
bash

scoop install tesseract
安装后,检查版本:

bash

tesseract --version
1.3 创建 Rust 项目
创建 Rust 项目:

bash

cargo new rust_ocr
cd rust_ocr
然后,在 Cargo.toml 中添加依赖:

toml

[dependencies]
image = "0.24" # 处理图像
tesseract = "0.13.0" # Tesseract OCR 绑定
更新项目:

bash

cargo build
2. 代码实现:Rust 识别验证码
在 src/main.rs 编写以下代码:

rust

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

// 预处理图像:灰度 & 二值化
fn preprocess_image(image_path: &str, output_path: &str) -> Result<(), Box> {
// 加载图片
let img = image::open(image_path)?;

// 转换为灰度图
let gray = img.grayscale();// 进行二值化处理
let binarized = binarize(&gray, 128);// 保存处理后的图像
binarized.save(output_path)?;Ok(())

}

// 二值化处理
fn binarize(img: &DynamicImage, threshold: u8) -> GrayImage {
let mut binary_img = GrayImage::new(img.width(), img.height());

for (x, y, pixel) in img.pixels() {let intensity = pixel.0[0]; // 取灰度值let new_pixel = if intensity > threshold { 255 } else { 0 };binary_img.put_pixel(x, y, Luma([new_pixel]));
}binary_img

}

// OCR 识别验证码
fn recognize_captcha(image_path: &str) -> Result<String, Box> {
let text = Tesseract::new(None, "eng")?
.set_image(image_path)?
.get_text()?;
Ok(text.trim().to_string())
}

fn main() {
let input_image = "captcha.png"; // 原始验证码图像
let processed_image = "processed.png"; // 预处理后的图像

// 预处理图像
if let Err(e) = preprocess_image(input_image, processed_image) {eprintln!("图像预处理失败: {}", e);return;
}// OCR 识别
match recognize_captcha(processed_image) {Ok(text) => println!("识别出的验证码: {}", text),Err(e) => eprintln!("OCR 识别失败: {}", e),
}

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

灰度化:
rust

let gray = img.grayscale();
二值化:
rust

let new_pixel = if intensity > threshold { 255 } else { 0 };
binary_img.put_pixel(x, y, Luma([new_pixel]));
3.2 OCR 解析
使用 tesseract 进行 OCR 识别:

rust
更多内容访问ttocr.com或联系1436423940
let text = Tesseract::new(None, "eng")?
.set_image(image_path)?
.get_text()?;
Tesseract::new(None, "eng") 创建 OCR 客户端
set_image(image_path)? 设置待识别图像
get_text()? 获取识别文本
4. 运行程序
确保 captcha.png 存在于项目目录下,然后运行:

bash

cargo run
示例输出:

makefile

识别出的验证码: 8K7TA
5. 提高 OCR 识别准确率
5.1 选择合适的 Tesseract PSM 模式
Tesseract 提供了不同的页面分割模式(PSM)。对于验证码,推荐使用 PSM 6(假设单行文本):

rust

Tesseract::new(None, "eng")?
.set_variable("tessedit_pageseg_mode", "6")?
5.2 限制字符集
如果验证码仅包含数字和大写字母,可以设定白名单:

rust

Tesseract::new(None, "eng")?
.set_variable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ")?
5.3 进一步图像优化
可以尝试:

去噪点(滤波)
字符分割(去除粘连字符)
6. 其他 OCR 方案
如果 Tesseract 不够精准,可以使用 深度学习 OCR:

Rust + PaddleOCR
Rust + ONNX Runtime(部署 AI 模型)
Rust + OpenCV OCR
示例(Rust 调用 Python OCR):

rust

use std::process::Command;
let output = Command::new("python3")
.arg("ocr_script.py")
.arg("processed.png")
.output()
.expect("OCR 执行失败");
println!("识别结果: {}", String::from_utf8_lossy(&output.stdout));
Python 代码(ocr_script.py):

python

import sys
import easyocr
reader = easyocr.Reader(['en'])
result = reader.readtext(sys.argv[1], detail=0)
print(" ".join(result))

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

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

相关文章

国产操作系统为何被称为“矛盾综合体”

不知不觉我们已经使用了足足两个月的深度系统,同时还用虚拟机体验了开放麒麟,并收到了来自基层一线国产硬件系统办公用户的投稿,而且本系列文章在电脑报、壹零社等新媒体平台也饱受读者朋友关注,话题讨论度持续走高。 而在翻看了大家的留言之后,我们发现其实国产操作系统堪…

matplotlib常用方法

目录安装库创建图画流程1. 创建画板2. 创建一个个在画板上的图形轴3. 开始在图上进行画画线图plot散点图scatter条形图bar、barh直方图hist饼图pie 安装库 pip install matplotlib创建图画流程 1. 创建画板 在任何绘图之前,我们需要一个Figure对象,可以理解成我们需要一张画板…

编译原理第三次作业

3.3.5(1) 正则表达式: define) other -> {bcdfghjklmnpqrstvwxyz} answer:other* a(other|a)* e(other|e)* i(other|i)* o(other|o)* u(other|u)* NFA: (由python代码生成,除了这个下面的DFA是基于开源工具绘制的)from graphviz import Digraphdef create_nfa():nfa = Digr…

第十二课 问答

这堂课的重点是谈一谈阅读理解(Reading Comprehension)解释一下两个例子信息提取:假设现在我们想要做一个关于奥巴马的背景信息提取,如图所示,我们现在想要知道奥巴马在哪里受的教育,我们将其转换成奥巴马在哪里毕业,然后进行阅读理解就好了 语义角色标注:假设现在我们…

Spring Task学习 -2025/3/13

Spring Task只要是需要定时处理的场景都可以使用Spring Task Cron 表达式cron在线表达式生成器 Spring Task 使用步骤示例

Rhino 8.12 下载与安装

Rhinoceros (Rhino) 是一款功能强大的 3D 建模软件,广泛应用于建筑设计、产品设计、工程分析、动画和插图等领域。Rhino 的建模主要基于曲线网络的构建,通过在空间中创建曲线网络并将其转换为曲面,用户可以实现高精度的 3D 模型设计。 1、安装包 扫描下方二维码关注「软知社…

.net微信支付接入

1.申请微信商户号 2.申请服务号 3.在商户号中接通服务号并且申请native支付 4.申请证书、密钥 5.nuget上安装“SKIT.FlurlHttpClient.Wechat.TenpayV3”包 6.发布到服务器时务必在应用程序池 - 应用程序 - 高级设置 - 加载用户配置文件 设置未true!!!!!否则会遇到下面的B…

HarmonyOS NEXT 实战系列01-ArkTS基础

​ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步扩展,保持了TS的基本风格,同时通过规范定义强化开发期静态检查和分析,提升程序执行稳定性和性能。 ArkTS提供了声明式UI范式、状态管理、渲染控制等相应的能力,让开…

WebGame - 免费在线游戏,畅玩不停!

在快节奏的现代生活中,休闲娱乐成为了人们缓解压力的重要方式。无论是上班族、学生,还是游戏爱好者,大家都希望能够随时随地玩到好玩的游戏,而 WebGame(https://www.webgame.one/)正是这样一个理想的平台!WebGame - 免费在线游戏,畅玩不停! 在快节奏的现代生活中,休闲…

springboot的mapper层的小问题

①如果sql语句如上,在进行苍穹外卖的分类查询时,不会报错,对应的sql语句是 ②如果sql语句如下 对应的sql语句为 对于上面的情况,我觉得是系统前端的问题,因为在第二种情况下,可以进行状态的启用,但是进行状态的禁用时,其对应的status为空

SpringCloud学习笔记(1)

SpringCloud学习笔记(1)之前我们学习的项目一是单体项目,可以满足小型项目或传统项目的开发。而在互联网时代,越来越多的一线互联网公司都在使用微服务技术。 从谷歌搜索指数来看,国内从自2016年底开始,微服务热度突然暴涨:那么:到底什么是微服务? 企业该不该引入微服务…

SpringCloud学习笔记(2)

SpringCloud学习笔记(2)1.网关路由 1.1.认识网关 什么是网关? 顾明思议,网关就是网络的关口。数据在网络间传输,从一个网络传输到另一网络时就需要经过网关来做数据的路由****和转发以及数据安全的校验。 更通俗的来讲,网关就像是以前园区传达室的大爷。外面的人要想进入园…