用 Rust + Tesseract OCR 解析验证码

  1. 环境准备
    1.1 安装 Rust
    Rust 可以通过官方提供的 rustup 进行安装:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
安装完成后,检查版本:

rustc --version
1.2 安装 Tesseract OCR
根据系统选择合适的安装方式:

Linux(Ubuntu 示例)

sudo apt update
sudo apt install tesseract-ocr libtesseract-dev
macOS(使用 Homebrew)

brew install tesseract
Windows

访问 Tesseract 官方 GitHub 下载 Windows 版本。

配置环境变量,使 tesseract 命令可用。

1.3 创建 Rust 项目
创建新的 Rust 项目:

cargo new captcha_ocr
cd captcha_ocr
1.4 添加依赖
编辑 Cargo.toml,添加 tesseract 和 image 库:

[dependencies]
tesseract = "0.15"
image = "0.24"
然后运行:

cargo build
2. 代码实现
在 src/main.rs 中编写如下代码:

use std::path::Path;
use tesseract::Tesseract;
use image::{DynamicImage, GenericImageView, ImageBuffer, Luma};

/// 图像预处理:灰度化 + 二值化
fn preprocess_image(image_path: &str) -> ImageBuffer<Luma, Vec> {
let img = image::open(image_path).expect("无法打开图像");
let gray = img.grayscale();

// 进行二值化处理
let threshold = 128;
let binary = gray.into_luma8().map(|p| {
    if p[0] > threshold { Luma([255]) } else { Luma([0]) }
});

binary

}

/// 进行 OCR 识别
fn recognize_captcha(image_path: &str) {
let processed_img = preprocess_image(image_path);
let processed_path = "processed_captcha.png";

// 保存处理后的图片
processed_img.save(processed_path).expect("无法保存处理后的图像");

// 初始化 Tesseract
let text = Tesseract::new(None, "eng")
    .expect("无法初始化 Tesseract")
    .set_image(Path::new(processed_path))
    .recognize()
    .expect("OCR 识别失败");

println!("识别出的验证码: {}", text.trim());

}

fn main() {
let image_path = "captcha.png"; // 你的验证码图片路径
recognize_captcha(image_path);
}
3. 代码解析
3.1 预处理验证码

fn preprocess_image(image_path: &str) -> ImageBuffer<Luma, Vec> {
let img = image::open(image_path).expect("无法打开图像");
let gray = img.grayscale();

// 进行二值化处理
let threshold = 128;
let binary = gray.into_luma8().map(|p| {
    if p[0] > threshold { Luma([255]) } else { Luma([0]) }
});

binary

}
灰度化:去除颜色干扰,提高 OCR 识别率。

二值化:将像素转换为黑白,提高字符对比度。

3.2 OCR 解析

let text = Tesseract::new(None, "eng")
.expect("无法初始化 Tesseract")
.set_image(Path::new(processed_path))
.recognize()
.expect("OCR 识别失败");
Tesseract::new(None, "eng"):初始化 OCR 解析器,使用 eng 语言模型。

.set_image(Path::new(processed_path)):设定 OCR 解析的目标图像。

.recognize():执行 OCR 识别。

  1. 运行 OCR 识别
    编译并运行:

cargo run
终端将输出识别的验证码内容。

  1. 提高 OCR 识别率
    5.1 选择合适的 PSM 模式
    Tesseract 提供了不同的页面分割模式(PSM),适用于不同的验证码类型:
    更多内容访问ttocr.com或联系1436423940
    let text = Tesseract::new(None, "eng")
    .expect("无法初始化 Tesseract")
    .set_variable("tessedit_pageseg_mode", "6") // PSM 6 适用于单行文本
    .set_image(Path::new(processed_path))
    .recognize()
    .expect("OCR 识别失败");
    5.2 训练自定义模型
    如果验证码包含特殊字体或字符,可以使用 tesseract 训练自己的 OCR 模型,提高识别率:

tesseract captcha.png captcha_output --psm 6 --oem 1
5.3 进一步图像优化
去除噪点:可以使用 imageproc 库进行形态学处理。

字符分割:如果验证码字符粘连,可尝试基于 opencv 进行字符切割,提高单字符识别率。

posted @ 2025-03-24 19:27  ttocr、com  阅读(26)  评论(0)    收藏  举报