Rust 和 Tesseract OCR 解析验证码
- 环境准备
1.1 安装 Rust
首先,确保你已经安装了 Rust。如果没有,可以使用 rustup 进行安装:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
然后检查 Rust 是否安装成功:
rustc --version
1.2 安装 Tesseract OCR
根据你的操作系统选择合适的安装方式:
macOS (使用 Homebrew)
brew install tesseract
Ubuntu/Linux
sudo apt update
sudo apt install tesseract-ocr
Windows
使用 Tesseract 官方 GitHub 提供的安装包进行安装,并确保 tesseract.exe 在环境变量 PATH 中。
1.3 安装 Rust Tesseract 绑定库
在 Rust 项目中,我们使用 leptess(Tesseract 的 Rust 绑定库):
cargo add leptess
2. 代码实现
在 Rust 项目中创建 main.rs 并添加以下代码:
use leptess::{LepTess, capi::PageSegMode};
use image::{DynamicImage, GenericImageView, Luma};
use imageproc::contrast::threshold;
use std::path::Path;
/// 预处理图像:灰度化 + 二值化
fn preprocess_image(input_path: &str, output_path: &str) -> Result<(), Box
let img = image::open(input_path)?;
let gray = img.to_luma8();
// 二值化处理,提高字符对比度
let binary = threshold(&gray, 128);
binary.save(output_path)?;
Ok(())
}
/// OCR 识别
fn recognize_text(image_path: &str) -> Result<String, Box
let mut tess = LepTess::new(None, "eng")?;
tess.set_image(image_path);
tess.set_page_seg_mode(PageSegMode::SingleLine);
let text = tess.get_utf8_text()?;
Ok(text.trim().to_string())
}
fn main() {
let input_image = "captcha.png"; // 替换为你的验证码图片
let processed_image = "processed_captcha.png";
println!("正在处理图像...");
if let Err(e) = preprocess_image(input_image, processed_image) {
eprintln!("图像预处理失败: {}", e);
return;
}
println!("执行 OCR 识别...");
match recognize_text(processed_image) {
Ok(text) => println!("识别出的验证码: {}", text),
Err(e) => eprintln!("OCR 识别失败: {}", e),
}
}
3. 代码解析
3.1 预处理图像
转换为灰度图:减少颜色干扰,提高识别率。
二值化(Thresholding):将灰度图转换为黑白,提高对比度。
使用 image 和 imageproc 库 进行图像处理:
let gray = img.to_luma8();
let binary = threshold(&gray, 128);
3.2 OCR 解析
加载 Tesseract OCR:
let mut tess = LepTess::new(None, "eng")?;
设置图片并执行识别:
tess.set_image(image_path);
let text = tess.get_utf8_text()?;
使用 PageSegMode::SingleLine 提高验证码识别率。
- 运行程序
确保 captcha.png 在项目目录下,然后运行:
cargo run
程序会加载验证码图像,进行处理并输出识别结果。
- 提高 OCR 识别率
5.1 选择更合适的 PSM
tess.set_page_seg_mode(PageSegMode::SingleChar);
如果验证码是单个字符的,可以使用 SingleChar。
5.2 进一步优化图像
去噪
字符分割
使用更好的 Tesseract 训练数据
浙公网安备 33010602011771号