使用 Rust 结合 Tesseract OCR 进行验证码识别

  1. 环境准备
    1.1 安装 Rust
    如果尚未安装 Rust,可以使用 Rust 官方提供的安装工具:

bash

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

bash

rustc --version
cargo --version
1.2 安装 Tesseract OCR
在 Linux/macOS 上使用包管理器安装:

bash

Ubuntu

sudo apt update
sudo apt install tesseract-ocr

macOS (使用 Homebrew)

brew install tesseract
Windows 用户可以从 Tesseract 官方 GitHub 下载并安装。

安装完成后,运行以下命令检查:

tesseract --version
1.3 创建 Rust 项目
创建一个新的 Rust 项目:

bash

cargo new rust_captcha_ocr
cd rust_captcha_ocr
1.4 添加依赖
在 Cargo.toml 中添加:

toml

[dependencies]
leptess = "0.14" # Rust 绑定的 Tesseract 库
image = "0.24" # 处理图像
然后运行:

bash

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

rust

use leptess::LepTess;
use image::{DynamicImage, GrayImage, Luma, imageops};
use std::path::Path;

/// 加载并转换图像为灰度
fn preprocess_image(image_path: &str) -> GrayImage {
let img = image::open(&Path::new(image_path)).expect("无法加载图像");
let gray_img = img.to_luma8();

// 二值化处理:提高 OCR 识别率
let binary_img = imageops::map_pixels(&gray_img, |_, _, pixel| {
    if pixel[0] > 128 { Luma([255]) } else { Luma([0]) }
});

binary_img

}

/// OCR 识别
fn recognize_captcha(image_path: &str) {
// 预处理图像
let processed_img = preprocess_image(image_path);

// 保存处理后的图像(可选)
let processed_path = "processed_captcha.png";
processed_img.save(processed_path).expect("无法保存处理后的图像");

// OCR 识别
let mut ocr = LepTess::new(None, "eng").expect("Tesseract 初始化失败");
ocr.set_image(processed_path);
let text = ocr.get_utf8_text().expect("OCR 识别失败");

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

}

fn main() {
let captcha_path = "captcha.png"; // 确保图片路径正确
recognize_captcha(captcha_path);
}
3. 代码解析
3.1 图像预处理
为了提高 OCR 识别率,我们对验证码图像进行了处理:

灰度化:移除颜色干扰
二值化:增强对比度
rust

let binary_img = imageops::map_pixels(&gray_img, |_, _, pixel| {
if pixel[0] > 128 { Luma([255]) } else { Luma([0]) }
});
3.2 OCR 解析
使用 leptess 进行 OCR 识别:

rust

let mut ocr = LepTess::new(None, "eng").expect("Tesseract 初始化失败");
ocr.set_image(processed_path);
let text = ocr.get_utf8_text().expect("OCR 识别失败");
LepTess::new(None, "eng") 创建 Tesseract OCR 客户端。
set_image(processed_path) 设定待识别的验证码图片。
get_utf8_text() 获取识别结果。
4. 运行程序
确保 captcha.png 存在于项目目录下,然后运行:

bash

cargo run
示例输出:

makefile

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

rust

ocr.set_variable("tessedit_pageseg_mode", "6").unwrap();
5.2 设定字符白名单
如果验证码仅包含数字和大写字母,可以限制识别范围:

rust

ocr.set_variable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ").unwrap();
5.3 进一步优化图像
可以尝试:

高斯模糊 过滤背景噪声
形态学变换 处理粘连字符
6. 其他 OCR 方案
如果 Tesseract 不能满足需求,可以使用 Rust + 深度学习 方案,例如:

tch-rs(Rust 绑定的 PyTorch)
onnxruntime-rs(Rust 绑定的 ONNX Runtime)
示例:

rust

use tch::{CModule, Tensor};

fn deep_learning_ocr(image_path: &str) {
let model = CModule::load("ocr_model.pt").expect("无法加载模型");
let input_tensor = Tensor::from_path(image_path).expect("无法加载图片");
let output = model.forward(&input_tensor);
println!("深度学习 OCR 结果: {:?}", output);
}
相比 Tesseract,深度学习方法对复杂验证码的识别率更高。

posted @ 2025-03-12 23:01  ttocr、com  阅读(16)  评论(0)    收藏  举报