使用 Rust 解析验证码(结合 Tesseract OCR)

  1. 环境准备
    1.1 安装 Rust
    如果尚未安装 Rust,可以使用官方推荐的 rustup 进行安装:

bash

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

bash

rustc --version
1.2 安装 Tesseract OCR
macOS(Homebrew 安装)
bash

brew install tesseract
Linux(Ubuntu 示例)

sudo apt update
sudo apt install tesseract-ocr -y
Windows
Windows 用户可以从 Tesseract 官方 GitHub 下载并安装 Tesseract,并配置环境变量。

检查 Tesseract 是否安装成功:

bash

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

bash

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

toml

[dependencies]
tesseract = "0.13"
image = "0.24"
运行:

bash

cargo build
2. 代码实现
编辑 src/main.rs,写入以下代码:

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

fn preprocess_image(input_path: &str, output_path: &str) {
let img = image::open(input_path).expect("无法打开图片");

// 转换为灰度图像
let gray_img = img.into_luma8();

// 二值化处理
let mut binary_img = gray_img.clone();
for pixel in binary_img.pixels_mut() {
    if pixel[0] > 128 {
        *pixel = Luma([255]); // 白色
    } else {
        *pixel = Luma([0]);   // 黑色
    }
}

// 保存处理后的图像
binary_img.save(output_path).expect("无法保存处理后的图像");

}

fn recognize_captcha(image_path: &str) -> String {
let mut tess = Tesseract::new(None, "eng").expect("无法初始化 Tesseract");
tess.set_image(image_path);
tess.set_variable("tessedit_pageseg_mode", "6").unwrap(); // PSM 6 适用于验证码
tess.recognize().expect("OCR 识别失败");
tess.get_text().unwrap_or_else(|_| "识别失败".to_string())
}

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

// 预处理验证码图像
preprocess_image(input_image, processed_image);

// OCR 识别
let result = recognize_captcha(processed_image);
println!("识别出的验证码: {}", result);

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

转换为灰度图像:
rust

let gray_img = img.into_luma8();
二值化处理(增强对比度):
rust

for pixel in binary_img.pixels_mut() {
if pixel[0] > 128 {
*pixel = Luma([255]); // 白色
} else {
*pixel = Luma([0]); // 黑色
}
}
保存处理后的图像:
rust

binary_img.save(output_path).expect("无法保存处理后的图像");
3.2 OCR 解析
初始化 Tesseract OCR:
rust

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

tess.set_variable("tessedit_pageseg_mode", "6").unwrap();
加载验证码图像并执行 OCR 识别:
rust

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

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

bash

cargo run
示例输出:

makefile

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

rust

tess.set_variable("tessedit_pageseg_mode", "10").unwrap(); // 识别单个字符
PSM 6:假设是单行文本(默认推荐)
PSM 7:只检测单个文本行
PSM 10:单个字符模式(适用于单字符验证码)
5.2 只识别特定字符
如果验证码仅包含字母和数字:

rust

tess.set_variable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ").unwrap();
5.3 进一步优化
降噪处理:可以使用 OpenCV for Rust 进行去噪优化
字符分割:如果验证码字符粘连,可尝试 OpenCV 进行字符分割
使用深度学习:如果 Tesseract 不能满足需求,可以结合 Rust TensorFlow 或 PyTorch Rust 进行训练,提高验证码识别成功率

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