用 Rust 与 Tesseract 实现图像验证码识别工具
一、项目介绍
本文将介绍如何用 Rust 语言结合 Tesseract OCR 引擎,构建一个命令行验证码识别程序。该程序适合部署在自动化系统、数据抓取、测试框架等环境中。
更多内容访问ttocr.com或联系1436423940
二、环境准备
- 安装 Rust
官网安装:https://rustup.rs/
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
2. 安装 Tesseract OCR
Ubuntu / Debian:
sudo apt install libleptonica-dev tesseract-ocr
macOS:
brew install tesseract
3. 新建 Rust 项目
cargo new captcha_ocr
cd captcha_ocr
编辑 Cargo.toml 添加依赖:
[dependencies]
leptess = "0.14"
三、Rust 实现验证码识别
编辑 src/main.rs:
use leptess::{LepTess, Variable};
use std::env;
fn main() {
let args: Vec
let image_path = args.get(1).unwrap_or(&"captcha.png".to_string());
let mut lt = LepTess::new(None, "eng").expect("Tesseract init failed");
lt.set_variable(Variable::TesseditCharWhitelist, "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
.expect("Failed to set whitelist");
lt.set_image(image_path);
let text = lt.get_utf8_text().expect("OCR failed");
let clean_text = text.trim().replace(" ", "").replace("\n", "");
println!("识别结果: {}", clean_text);
}
四、运行程序
放一张验证码图像(例如 captcha.png)在项目根目录,然后运行:
cargo run -- captcha.png
示例输出:
识别结果: 9F2K
五、批量识别(可选扩展)
你可以通过 std::fs 实现目录下批量图像识别:
use std::fs;
fn batch_process(folder: &str) {
for entry in fs::read_dir(folder).unwrap() {
let path = entry.unwrap().path();
if path.extension().unwrap_or_default() == "png" {
let mut lt = LepTess::new(None, "eng").unwrap();
lt.set_variable(Variable::TesseditCharWhitelist, "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789").unwrap();
lt.set_image(path.to_str().unwrap());
let text = lt.get_utf8_text().unwrap();
let clean = text.trim().replace(" ", "").replace("\n", "");
println!("{} => {}", path.file_name().unwrap().to_string_lossy(), clean);
}
}
}
六、识别优化技巧
优化方式 描述
设置字符白名单 限定识别范围提高准确率
图像预处理(推荐) 使用 ImageMagick、OpenCV 等进行灰度化/阈值处理
设置页面识别模式 修改 --psm 模式(暂未暴露于 leptess,可修改配置)
使用高清图像 输入图像清晰度越高,识别成功率越高
七、适用场景
场景 描述
命令行批量识别工具 适用于数据清洗、图片 OCR 流水线
自动化测试工具组件 可作为 Rust 自动测试系统的一部分
高性能验证码接口服务 构建在 Actix Web / Axum 上的验证码识别服务
与图像处理结合使用 可与 image 或 opencv crate 组合使用
浙公网安备 33010602011771号