Tesseract OCR 解析验证码

news/2025/3/18 23:48:43/文章来源:https://www.cnblogs.com/ocr12/p/18780103
  1. 环境准备
    1.1 安装 Rust
    如果尚未安装 Rust,可以使用官方推荐的 rustup 进行安装:

bash

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

bash

rustc --version
cargo --version
1.2 安装 Tesseract OCR
Windows
从 Tesseract 官方 GitHub 下载 Windows 安装包
安装后,将 Tesseract 添加到环境变量
Linux(Ubuntu 示例)
bash

sudo apt update
sudo apt install tesseract-ocr -y
macOS(使用 Homebrew)
bash

brew install tesseract
安装完成后,检查 Tesseract 是否可用:

bash

tesseract --version
1.3 创建 Rust 项目
bash

cargo new rust_captcha_ocr
cd rust_captcha_ocr
编辑 Cargo.toml,添加 Tesseract 相关依赖:

toml

[dependencies]
leptess = "0.14"
image = "0.24"
2. 代码实现
在 src/main.rs 中写入以下代码:

use leptess::{LepTess, Variable};
use image::{DynamicImage, GenericImageView, Luma, ImageBuffer};

fn preprocess_image(input_path: &str, output_path: &str) -> std::io::Result<()> {
// 读取图像
let img = image::open(input_path).expect("无法打开图片");

// 转换为灰度图像
let gray_img = img.to_luma8();// 二值化处理(阈值设定为 128)
let binary_img: ImageBuffer<Luma<u8>, Vec<u8>> = ImageBuffer::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)?;Ok(())

}

fn recognize_captcha(image_path: &str) -> String {
let mut tess = LepTess::new(None, "eng").expect("无法初始化 Tesseract");

// 设置 PSM 模式为 6(假设是单行文本)
tess.set_variable(Variable::PageSegMode, "6").expect("无法设置 PSM 模式");// 加载图像并识别
tess.set_image(image_path);
tess.recognize().expect("OCR 识别失败");tess.get_utf8_text().unwrap_or_else(|_| "识别失败".to_string())

}

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

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

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

转换为灰度图像,去除颜色干扰:
rust

let gray_img = img.to_luma8();
二值化处理,增强字符清晰度:
rust

let binary_img: ImageBuffer<Luma, Vec> = ImageBuffer::from_fn(gray_img.width(), gray_img.height(), |x, y| {
if gray_img.get_pixel(x, y)[0] > 128 {
Luma([255]) // 白色
} else {
Luma([0]) // 黑色
}
});
保存处理后的图像:
rust

binary_img.save(output_path)?;
3.2 OCR 解析
初始化 Tesseract OCR:
rust

let mut tess = LepTess::new(None, "eng").expect("无法初始化 Tesseract");
设置 Tesseract PSM 模式(6 适用于验证码):

tess.set_variable(Variable::PageSegMode, "6").expect("无法设置 PSM 模式");
加载验证码图像并执行 OCR 识别:
rust

tess.set_image(image_path);
tess.recognize().expect("OCR 识别失败");
获取识别结果:
rust

tess.get_utf8_text().unwrap_or_else(|_| "识别失败".to_string())
4. 运行程序
确保 captcha.png 存在于项目目录,然后运行:

bash

cargo run
示例输出:

makefile

识别出的验证码: H9XG2
5. 提高 OCR 识别率
5.1 选择合适的 PSM 模式
Tesseract 提供了不同的页面分割模式(PSM):

rust

tess.set_variable(Variable::PageSegMode, "7").expect("无法设置 PSM 模式");
PSM 6:假设是单行文本(默认推荐)
PSM 7:只检测单个文本行
5.2 只识别特定字符
如果验证码仅包含字母和数字:

rust

tess.set_variable(Variable::TesseditCharWhitelist, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ")
.expect("无法设置字符白名单");
5.3 进一步优化
降噪处理:可以使用 OpenCV-rust 进行模糊滤波或膨胀腐蚀操作,去除干扰噪点
字符分割:如果验证码字符粘连,可尝试字符分割算法,提高单字符识别率
使用深度学习:如果 Tesseract 无法满足需求,可以考虑 Rust + TensorFlow 或 ONNX 进行自定义 OCR 训练

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

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

相关文章

20244203张晨曦 实验一《Python程序设计》实验报告

20244203张晨曦《Python程序设计》实验一报告 课程:《Python程序设计》 班级: 2442 姓名: 张晨曦 学号:20244203 实验教师:王志强 实验日期:2025年3月18日 必修/选修: 专选课 1.实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能; 3.编写程序,练习变量和…

Cobalt Strike基础

Cobalt Strike基础 Staged(有阶段) 在有阶段的执行方式中,分为Stager和Stage两个阶段Stager(初始执行载荷):​ 定义:Stager是Stage 1,是一个较小的、轻量级的初始执行载荷 ​ 作用:与服务端建立初始连接,并从服务器下载更大的Payload,也就是Stage2Stage(更大、…

OP222柔性振动白色料盘污染会引发的问题

下图为污损的料盘料盘污损会导致以下问题: 1.料盘里面缺料但是后面料仓就是不送料 柔性振动系统里面设置了加料个数,下图里面设置为15,表示如果相机识别区域里面的总阴影面积<15个零件面积,料仓加一次料。下图红框是识别区域,里面一道道横杠就是污损导致的阴影,这些阴…

鸿蒙特效教程05-鸿蒙很开门特效

鸿蒙特效教程05-鸿蒙很开门特效本教程适合HarmonyOS初学者,通过简单到复杂的步骤,通过层叠布局 + 动画,一步步实现这个"鸿蒙很开门"特效。本教程能收获Stack 层叠布局 animate、animateTo 动画 @State 状态管理最终效果预览 屏幕上有一个双开门,点击中间的按钮后…

An Elder Brother Is Like a Father :My True Story

![](https://img2024.cnblogs.com/blog/3617180/202503/3617180-20250318230914275-242579668.jpg)An Elder Brother Is Like a Father :My True Story In your life, do you have a very important person? Who is he/she? Why is he/she significant for you and whats you…

element-plus学习 -2025/3/18

{ ...this.form } 是 JavaScript 中的 ​扩展运算符(Spread Operator)​,它的作用是将 this.form 对象的所有属性“展开”到一个新的对象中 例如 form :{ name : , score: } 简易学生分数管理系统 element-plus实现 <!DOCTYPE html> <html lang="en">…

web161笔记(getimagesize()图片文件头检测)

这次上传失败了,尝试在头部加了图片文件头,就过去了,所以这里应该是用了getimagesize()进行检测getimagesize(): 会对目标文件的16进制去进行一个读取,去读取头几个字符串是不是符合图片的要求所以在上题的基础上都加个GIF89a图片头就可以了 GIF89a加个图⽚的头欺骗检测 .u…

MIT6.5840 2024 Spring Lab1

MIT6.5840 2024 Spring Lab1 前言本文主要作为笔记使用,这次实验基本是边查GO的语法边做的,所以代码写的不够优雅,无法充分发挥GO的一些特性,因此本文的代码实现有很大的优化空间,欢迎各位大佬指正,希望本文能给一些正在学习的小伙伴提供一些思路。最后希望小伙伴们不要抄代码,…

OP222机器人与柔性振动盘交互逻辑

1.机器人运行逻辑主体逻辑就是PLC发送取料指令后,机器人向柔性振动系统索要OK件的坐标-->柔性振动系统接收到指令后拍照,识别出OK件就发送其坐标,找不到OK件就振动一下再拍照-->机器人通过获取到的坐标去取料-->取料后检查真空吸盘负压信号,如果吸住了即取料成功,…

web157-web159笔记(+分号;过滤+()过滤)

web157 .user.ini正常上传了,但是在传mumuzi.png的时候出错看来⼜过滤了什么不知名的东⻄,测试删掉system报错,tac报错,然后发现是分号的问题。这⾥ 使⽤反引号(相当于shell_exec() )<?=`tac ../f*`?> (后来发现短标签可以不要分号…

20244213 实验一《Python程序设计》实验报告

实验一 课程:《Python程序设计》 班级: 2442 姓名: 孙爱宣 学号:20244213 实验教师:王志强 实验日期:2025年3月18日 必修/选修: 公选课 1.实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能; 3.编写程序,练习变量和类型、字符串、对象、缩进和注释等;编…

web154-web156笔记(图片内容过滤php-短标签形式转换)

继续按照上题步骤,传一个.user.ini文件,接着在上传图片马的时候报错了 解码后显示的文字是不支持格式,说明可能内容里的php被ban了,改成短标签的形式再上传,而且末尾不能有php,做任意匹配,可以通过 短标签形式:<?=system("tac ../f*");?> 原来…