Rust 结合 Tesseract OCR 进行验证码识别


1. 环境准备
1.1 安装 Rust
如果尚未安装 Rust,可以使用 Rust 官方安装工具 rustup:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
然后检查 Rust 版本:

rustc --version
1.2 安装 Tesseract OCR
根据操作系统安装 Tesseract:

Linux (Ubuntu)


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

brew install tesseract
Windows (使用 Scoop)

scoop install tesseract
检查是否安装成功:

tesseract --version
1.3 创建 Rust 项目

cargo new rust_ocr
cd rust_ocr
1.4 添加依赖
在 Cargo.toml 文件中添加以下依赖:

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

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

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

// 预处理图像
fn preprocess_image(image_path: &str, output_path: &str) -> Result<(), Box<dyn std::error::Error>> {
    // 加载图像
    let img = image::open(image_path)?.to_luma8();

    // 二值化处理(去除噪点,提高识别率)
    let threshold = 128;
    let binary_img: GrayImage = ImageBuffer::from_fn(img.width(), img.height(), |x, y| {
        if img.get_pixel(x, y)[0] > threshold {
            Luma([255])
        } else {
            Luma([0])
        }
    });

    // 保存处理后的图像
    binary_img.save(output_path)?;
    Ok(())
}

// OCR 识别
fn recognize_captcha(image_path: &str) -> Result<String, Box<dyn std::error::Error>> {
    let text = Tesseract::new(None, "eng")?
        .set_image(image_path)?
        .recognize()?;
    Ok(text.trim().to_string())
}

fn main() {
    let input_path = "captcha.png";
    let processed_path = "processed_captcha.png";

    // 预处理图像
    if let Err(e) = preprocess_image(input_path, processed_path) {
        eprintln!("图像预处理失败: {}", e);
        return;
    }

    // 识别验证码
    match recognize_captcha(processed_path) {
        Ok(text) => println!("识别出的验证码: {}", text),
        Err(e) => eprintln!("OCR 识别失败: {}", e),
    }
}
3. 代码解析
3.1 预处理验证码

fn preprocess_image(image_path: &str, output_path: &str)
加载图像并转换为灰度

二值化处理(使用固定阈值)

保存处理后的验证码

3.2 OCR 解析

fn recognize_captcha(image_path: &str)
使用 Tesseract 进行 OCR 识别

返回识别的验证码文本

4. 运行程序
确保 captcha.png 存在,然后运行:

cargo run
程序会加载验证码图片,进行处理,并输出识别出的文本。

5. 提高 OCR 识别率
调整 Tesseract 识别模式

let text = Tesseract::new(None, "eng")?
    .set_variable("tessedit_pageseg_mode", "6")?
    .set_image(image_path)?
    .recognize()?;
去除噪点(可以使用 OpenCV 进行更高级的图像处理)