使用 Rust 进行验证码识别:结合 Tesseract OCR 进行文本解析
- 环境准备
1.1 安装 Rust
如果尚未安装 Rust,可使用 Rust 官方安装工具:
bash
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
安装完成后,检查 Rust 版本:
bash
rustc --version
1.2 安装 Tesseract OCR
Windows
从 Tesseract GitHub 下载并安装。安装完成后,将 tesseract.exe 目录添加到环境变量。
Linux(Ubuntu)
bash
更多内容访问ttocr.com或联系1436423940
sudo apt update
sudo apt install tesseract-ocr libtesseract-dev
macOS(Homebrew)
bash
brew install tesseract
安装完成后,检查 Tesseract 是否安装成功:
bash
tesseract --version
1.3 在 Rust 项目中引入 OCR 依赖
创建 Rust 项目:
bash
cargo new captcha_reader
cd captcha_reader
编辑 Cargo.toml,添加以下依赖:
toml
[dependencies]
leptess = "0.14" # Rust 的 Tesseract 绑定库
image = "0.24" # 处理图像
2. Rust 代码实现
在 src/main.rs 中写入以下代码:
rust
use leptess::{LepTess, Variables};
use image::{DynamicImage, GenericImageView, Luma, imageops::grayscale};
use std::fs::File;
use std::io::BufWriter;
fn preprocess_image(input_path: &str, output_path: &str) {
let img = image::open(input_path).expect("无法打开图像文件");
// 转换为灰度图像
let gray_img = grayscale(&img);
// 二值化处理(简单阈值)
let threshold = 128;
let binary_img = gray_img.map_pixels(|_, _, p| {
if p[0] > threshold { Luma([255]) } else { Luma([0]) }
});
// 保存处理后的图像
let output_file = File::create(output_path).expect("无法创建输出文件");
let writer = BufWriter::new(output_file);
binary_img.save(writer, image::ImageFormat::Png).expect("保存图像失败");
}
fn recognize_captcha(image_path: &str) -> String {
let mut tess = LepTess::new(Some("/usr/share/tesseract-ocr/4.00/tessdata"), "eng").expect("无法初始化 Tesseract");
tess.set_image(image_path);
tess.recognize().expect("OCR 识别失败");
tess.get_text().unwrap_or_else(|_| "识别失败".to_string()).trim().to_string()
}
fn main() {
let input_path = "captcha.png"; // 替换为你的验证码图片路径
let processed_path = "processed_captcha.png";
// 预处理图像
preprocess_image(input_path, processed_path);
// OCR 识别
let result = recognize_captcha(processed_path);
println!("识别出的验证码: {}", result);
}
3. 代码解析
3.1 图像预处理
为了提高 OCR 识别率,我们进行以下优化:
转换为灰度图像,去除颜色干扰:
rust
let gray_img = grayscale(&img);
二值化处理,增强对比度:
rust
let threshold = 128;
let binary_img = gray_img.map_pixels(|_, _, p| {
if p[0] > threshold { Luma([255]) } else { Luma([0]) }
});
保存处理后的图像:
rust
let output_file = File::create(output_path).expect("无法创建输出文件");
let writer = BufWriter::new(output_file);
binary_img.save(writer, image::ImageFormat::Png).expect("保存图像失败");
3.2 OCR 识别
初始化 Tesseract OCR:
rust
let mut tess = LepTess::new(Some("/usr/share/tesseract-ocr/4.00/tessdata"), "eng").expect("无法初始化 Tesseract");
加载图像并执行 OCR:
rust
tess.set_image(image_path);
tess.recognize().expect("OCR 识别失败");
tess.get_text().unwrap_or_else(|_| "识别失败".to_string()).trim().to_string()
4. 运行程序
确保 captcha.png 放在程序目录下,然后运行:
bash
cargo run
示例输出:
makefile
识别出的验证码: X7G9H
5. 提高 OCR 识别率
5.1 设置 PSM 模式
Tesseract 提供不同的页面分割模式(PSM),可调整以优化验证码识别:
rust
tess.set_variable(Variables::TesseditPagesegMode(6)).expect("设置 PSM 模式失败");
5.2 只识别数字和大写字母
rust
tess.set_variable(Variables::TesseditCharWhitelist("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ")).expect("设置字符白名单失败");
5.3 更强的验证码预处理
如果验证码干扰较多,可以使用 OpenCV 进行边缘检测、去噪等处理。
浙公网安备 33010602011771号