使用 Rust + Tesseract 实现英文数字验证码识别
一、项目概述
我们将构建一个简单的 Rust 命令行程序,完成以下任务:
加载验证码图像(PNG/JPG)
更多内容访问ttocr.com或联系1436423940
使用 ImageMagick 预处理图像(灰度/二值)
调用系统 Tesseract 识别文本
输出过滤后的验证码(仅保留英文字母和数字)
二、环境准备
- 安装 Rust
curl https://sh.rustup.rs -sSf | sh
2. 安装依赖工具
Tesseract OCR:
sudo apt install tesseract-ocr # Ubuntu
brew install tesseract # macOS
ImageMagick(图像处理):
sudo apt install imagemagick
brew install imagemagick
三、创建项目
cargo new captcha_ocr
cd captcha_ocr
编辑 Cargo.toml 添加依赖:
[dependencies]
regex = "1"
四、编写识别程序
编辑 src/main.rs:
use std::process::Command;
use std::fs;
use regex::Regex;
fn main() {
let input_image = "captcha.png";
let processed_image = "processed.png";
// Step 1: 图像预处理(使用 ImageMagick 调用 convert 命令)
let convert_status = Command::new("convert")
.arg(input_image)
.arg("-colorspace")
.arg("Gray")
.arg("-threshold")
.arg("50%")
.arg(processed_image)
.status()
.expect("无法执行 convert 命令");
if !convert_status.success() {
eprintln!("图像预处理失败");
return;
}
// Step 2: 使用 Tesseract 识别
let output = Command::new("tesseract")
.arg(processed_image)
.arg("stdout")
.arg("-l")
.arg("eng")
.arg("--psm")
.arg("7")
.arg("-c")
.arg("tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")
.output()
.expect("无法执行 tesseract 命令");
let raw_output = String::from_utf8_lossy(&output.stdout);
// Step 3: 清洗结果
let re = Regex::new(r"[A-Za-z0-9]+").unwrap();
if let Some(mat) = re.find(&raw_output) {
println!("识别出的验证码为: {}", mat.as_str());
} else {
println!("未能识别验证码");
}
// Step 4: 清理临时文件
let _ = fs::remove_file(processed_image);
}
五、准备验证码图像
放置一张验证码图像 captcha.png 于项目根目录,图像应包含英文和数字字符。
六、运行程序
构建并运行:
cargo run
输出示例:
识别出的验证码为: A7K2T
浙公网安备 33010602011771号