用 Rust 结合 Tesseract OCR 进行验证码识别
- 环境准备
1.1 安装 Rust
Rust 可以通过官方的 rustup 安装:
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 在系统 PATH 中
Linux(Ubuntu)
bash
sudo apt install tesseract-ocr
macOS(Homebrew)
bash
brew install tesseract
安装完成后,检查是否成功安装:
bash
tesseract --version
2. 创建 Rust 项目并安装依赖
创建一个新的 Rust 项目:
bash
cargo new captcha_reader
cd captcha_reader
然后,在 Cargo.toml 中添加 tesseract 相关的 Rust 库:
toml
[dependencies]
tesseract = "0.16.1"
运行以下命令以下载依赖:
cargo build
3. 代码实现
编辑 src/main.rs,写入以下 Rust 代码:
rust
use std::process::Command;
use std::fs;
fn main() {
let image_path = "captcha.png"; // 替换为你的验证码图片路径
let output_file = "captcha_result";
// 调用 Tesseract 进行 OCR 识别
let status = Command::new("tesseract")
.arg(image_path)
.arg(output_file)
.arg("-l")
.arg("eng")
.status()
.expect("无法执行 Tesseract 命令");
if !status.success() {
eprintln!("Tesseract 识别失败");
return;
}
// 读取 OCR 识别结果
let text = fs::read_to_string(format!("{}.txt", output_file))
.expect("无法读取识别结果文件");
// 输出识别结果
println!("识别出的验证码: {}", text.trim());
// 清理临时文件
let _ = fs::remove_file(format!("{}.txt", output_file));
}
4. 代码解析
4.1 使用 Command::new() 调用 Tesseract
rust
let status = Command::new("tesseract")
.arg(image_path)
.arg(output_file)
.arg("-l")
.arg("eng")
.status()
.expect("无法执行 Tesseract 命令");
通过 Rust std::process::Command 调用外部 tesseract 命令
-l eng 指定使用英文 OCR 识别
4.2 读取 OCR 结果
rust
let text = fs::read_to_string(format!("{}.txt", output_file))
.expect("无法读取识别结果文件");
读取 Tesseract 识别的验证码结果文件
4.3 清理临时文件
rust
let _ = fs::remove_file(format!("{}.txt", output_file));
删除 captcha_result.txt 以避免不必要的文件残留
5. 运行程序
确保 captcha.png 存在于项目目录下,然后运行:
bash
cargo run
示例输出:
makefile
识别出的验证码: H7X9G
6. 提高 OCR 识别率
6.1 使用 Tesseract PSM 模式
rust
let status = Command::new("tesseract")
.arg(image_path)
.arg(output_file)
.arg("-l")
.arg("eng")
.arg("--psm")
.arg("6")
.status()
.expect("无法执行 Tesseract 命令");
--psm 6 适用于单行验证码,提高识别率
6.2 设置字符白名单
rust
let status = Command::new("tesseract")
.arg(image_path)
.arg(output_file)
.arg("-l")
.arg("eng")
.arg("-c")
.arg("tessedit_char_whitelist=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ")
.status()
.expect("无法执行 Tesseract 命令");
限制 Tesseract 只识别数字和大写字母,减少错误识别
6.3 预处理验证码
可以结合 image 库进行验证码预处理,例如:
toml
[dependencies]
image = "0.24"
然后在代码中进行灰度化、二值化等处理:
rust
use image::{DynamicImage, GrayImage, Luma, io::Reader as ImageReader};
fn preprocess_image(input_path: &str, output_path: &str) {
let img = ImageReader::open(input_path)
.expect("无法打开图像文件")
.decode()
.expect("无法解码图像");
let gray_img: GrayImage = img.to_luma8();
// 进行二值化处理
let binary_img = gray_img.map(|p| {
if p[0] > 128 { Luma([255]) } else { Luma([0]) }
});
binary_img.save(output_path).expect("无法保存处理后的图像");
}
这段代码会将验证码转换为黑白图像,提高识别率
浙公网安备 33010602011771号