使用 Rust + Tesseract 实现英文数字验证码识别

一、项目概述
我们将构建一个简单的 Rust 命令行程序,完成以下任务:

加载验证码图像(PNG/JPG)
更多内容访问ttocr.com或联系1436423940
使用 ImageMagick 预处理图像(灰度/二值)

调用系统 Tesseract 识别文本

输出过滤后的验证码(仅保留英文字母和数字)

二、环境准备

  1. 安装 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

posted @ 2025-07-05 20:02  ttocr、com  阅读(15)  评论(0)    收藏  举报