Rust + Tesseract OCR 解析验证码

  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 中写入以下代码:

rust

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 适用于验证码):
rust

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 训练

posted @ 2025-03-18 22:08  ttocr、com  阅读(16)  评论(0)    收藏  举报