使用 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
在不同操作系统上安装 Tesseract:

Linux(Ubuntu/Debian):

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

brew install tesseract
Windows: 从 Tesseract 官方 GitHub 下载并安装。

然后,检查安装是否成功:

tesseract --version
1.3 添加 Rust OCR 依赖
在 Cargo.toml 中添加 tesseract-rs 依赖:

[dependencies]
tesseract = "0.7"
image = "0.24"
2. 代码实现
在 src/main.rs 中编写如下代码:

use image::{DynamicImage, GrayImage, Luma, imageops::FilterType};
use tesseract::Tesseract;
use std::path::Path;

/// 预处理图像(灰度化 + 二值化)
fn preprocess_image(image_path: &str) -> GrayImage {
    let img = image::open(image_path).expect("无法打开图像文件");

    // 转换为灰度图像
    let gray = img.to_luma8();

    // 二值化处理(阈值设定为 128)
    let binary = gray.map(|p| {
        if p[0] > 128 {
            Luma([255]) // 白色
        } else {
            Luma([0]) // 黑色
        }
    });

    binary
}

/// 进行 OCR 识别
fn recognize_text(image_path: &str) -> String {
    let processed_image = preprocess_image(image_path);

    // 保存处理后的图像(可选)
    let output_path = "processed_captcha.png";
    processed_image.save(output_path).expect("无法保存图像");

    // 使用 Tesseract 进行 OCR 解析
    let text = Tesseract::new(None, "eng")
        .unwrap()
        .set_image(output_path)
        .recognize()
        .unwrap();

    text
}

fn main() {
    let image_path = "captcha.png"; // 你的验证码图像
    let result = recognize_text(image_path);
    println!("识别出的验证码: {}", result.trim());
}
3. 代码解析
3.1 预处理图像
灰度化:

let gray = img.to_luma8();
这将彩色图像转换为灰度图,去除颜色干扰。

二值化:

let binary = gray.map(|p| {
    if p[0] > 128 {
        Luma([255]) // 白色
    } else {
        Luma([0]) // 黑色
    }
});
设置阈值(128),增强字符对比度,提高识别率。

3.2 OCR 解析
加载 Tesseract OCR:

let text = Tesseract::new(None, "eng")
这里我们设定 OCR 语言为 eng(英语)。

设定要识别的图像:

.set_image(output_path)
执行 OCR 解析:

.recognize()
识别图像中的文本,并返回结果。

4. 运行 OCR 识别
确保 captcha.png 存在于项目目录中,然后运行:


cargo run
你将在终端看到验证码的识别结果。

5. 提高 OCR 识别率
5.1 选择合适的 PSM 模式
Tesseract 提供不同的 页面分割模式(PSM),针对验证码推荐使用 PSM 6(假设单行文本):

let text = Tesseract::new(None, "eng")
    .unwrap()
    .set_image(output_path)
    .set_variable("tessedit_pageseg_mode", "6") // PSM 6
    .recognize()
    .unwrap();
5.2 进一步优化
去除噪点(可使用 OpenCV 进行形态学处理)

使用 Tesseract 训练数据(针对验证码字体训练模型)

字符分割(如果验证码字符粘连,可以进行字符拆分)

猜你喜欢

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