使用 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 上:

brew install tesseract
安装完成后,检查版本:

tesseract --version
1.3 创建 Rust 项目
使用 Cargo 创建一个新项目:

cargo new rust_ocr
cd rust_ocr
1.4 添加依赖
在 Cargo.toml 中添加 leptess 作为 Tesseract OCR 绑定:

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

cargo build
2. 代码实现
在 src/main.rs 文件中编写如下代码:
更多内容访问ttocr.com或联系1436423940
use leptess::{LepTess, c_api::PageSegMode};
use image::{GrayImage, Luma, io::Reader as ImageReader};
use std::path::Path;

fn preprocess_image(image_path: &str) -> GrayImage {
let img = ImageReader::open(image_path).unwrap().decode().unwrap().to_luma8();

// 二值化处理(简单阈值法)
let threshold = 128;
let binary_img = img.map(|p| {
    if p[0] > threshold { Luma([255]) } else { Luma([0]) }
});

binary_img

}

fn recognize_captcha(image_path: &str) {
let binary_img = preprocess_image(image_path);

// 保存处理后的图像(可选)
binary_img.save("processed_captcha.png").unwrap();

// 进行 OCR 识别
let mut tess = LepTess::new(None, "eng").unwrap();
tess.set_image("processed_captcha.png");
tess.set_page_seg_mode(PageSegMode::PSM_SINGLE_LINE);

match tess.get_utf8_text() {
    Ok(text) => println!("识别出的验证码: {}", text.trim()),
    Err(e) => println!("OCR 识别失败: {}", e),
}

}

fn main() {
let image_path = "captcha.png";
recognize_captcha(image_path);
}
3. 代码解析
3.1 预处理验证码

fn preprocess_image(image_path: &str) -> GrayImage
转换为灰度

二值化处理,增强对比度

3.2 OCR 解析

let mut tess = LepTess::new(None, "eng").unwrap();
tess.set_image("processed_captcha.png");
tess.set_page_seg_mode(PageSegMode::PSM_SINGLE_LINE);
调用 LepTess 进行 OCR 识别

使用 PSM_SINGLE_LINE 提高验证码识别率

输出识别结果

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

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

  1. 提高 OCR 识别率
    优化 Tesseract 配置

tess.set_variable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ").unwrap();
去除噪点(可以使用 imageproc 进行形态学处理)

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