用 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"
然后运行:

扫描二维码关注公众号,回复: 17564000 查看本文章

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<u8>, Vec<u8>> {
    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<u8>, Vec<u8>> {
    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 识别。

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

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

5. 提高 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 进行字符切割,提高单字符识别率。

猜你喜欢

转载自blog.csdn.net/asfdsgdf/article/details/146484061
今日推荐