使用 Rust 和 Tesseract 实现图像验证码识别
一、开发环境准备
安装 Rust 编译器
可通过官方推荐的 rustup 安装:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
安装 Tesseract OCR
更多内容访问ttocr.com或联系1436423940
Linux:
sudo apt install tesseract-ocr
macOS:
brew install tesseract
Windows:下载并安装后,将路径添加到环境变量
二、创建 Rust 项目
cargo new captcha_ocr
cd captcha_ocr
编辑 Cargo.toml,添加依赖:
[dependencies]
regex = "1"
三、Rust 源码 main.rs
编辑 src/main.rs:
use std::env;
use std::fs;
use std::process::Command;
use regex::Regex;
fn recognize_captcha(image_path: &str) {
if !std::path::Path::new(image_path).exists() {
println!("文件不存在: {}", image_path);
return;
}
let output_base = "output_temp";
let whitelist = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
let status = Command::new("tesseract")
.args([
image_path,
output_base,
"-l", "eng",
"-c", &format!("tessedit_char_whitelist={}", whitelist),
])
.status()
.expect("无法运行 tesseract");
if !status.success() {
println!("Tesseract 执行失败");
return;
}
let result_file = format!("{}.txt", output_base);
if !std::path::Path::new(&result_file).exists() {
println!("输出文件不存在");
return;
}
let content = fs::read_to_string(&result_file).unwrap_or_default();
let re = Regex::new(r"[^A-Z0-9]").unwrap();
let cleaned = re.replace_all(&content, "").to_string();
println!("识别结果: {}", cleaned);
let _ = fs::remove_file(result_file);
}
fn main() {
let args: Vec
if args.len() != 2 {
println!("用法: cargo run -- <图像路径>");
return;
}
recognize_captcha(&args[1]);
}
四、运行示例
构建并运行:
cargo run -- ./captcha_test.png
输出示例:
识别结果: G7F2
五、批量处理多个图像
可添加目录遍历处理多个验证码图:
use std::fs::read_dir;
fn batch_recognize(dir: &str) {
for entry in read_dir(dir).unwrap() {
let path = entry.unwrap().path();
if path.extension().map_or(false, |ext| ext == "png") {
println!("识别中: {}", path.display());
recognize_captcha(path.to_str().unwrap());
}
}
}
调用示例:
batch_recognize("./captcha_images");
浙公网安备 33010602011771号