Rust 和 Tesseract OCR 解析验证码

  1. 环境准备
    1.1 安装 Rust
    首先,确保你已经安装了 Rust。如果没有,可以使用 rustup 进行安装:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
然后检查 Rust 是否安装成功:

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

macOS (使用 Homebrew)

brew install tesseract
Ubuntu/Linux

sudo apt update
sudo apt install tesseract-ocr
Windows
使用 Tesseract 官方 GitHub 提供的安装包进行安装,并确保 tesseract.exe 在环境变量 PATH 中。

1.3 安装 Rust Tesseract 绑定库
在 Rust 项目中,我们使用 leptess(Tesseract 的 Rust 绑定库):

cargo add leptess
2. 代码实现
在 Rust 项目中创建 main.rs 并添加以下代码:

use leptess::{LepTess, capi::PageSegMode};
use image::{DynamicImage, GenericImageView, Luma};
use imageproc::contrast::threshold;
use std::path::Path;

/// 预处理图像:灰度化 + 二值化
fn preprocess_image(input_path: &str, output_path: &str) -> Result<(), Box> {
let img = image::open(input_path)?;
let gray = img.to_luma8();

// 二值化处理,提高字符对比度
let binary = threshold(&gray, 128);

binary.save(output_path)?;
Ok(())

}

/// OCR 识别
fn recognize_text(image_path: &str) -> Result<String, Box> {
let mut tess = LepTess::new(None, "eng")?;
tess.set_image(image_path);
tess.set_page_seg_mode(PageSegMode::SingleLine);

let text = tess.get_utf8_text()?;
Ok(text.trim().to_string())

}

fn main() {
let input_image = "captcha.png"; // 替换为你的验证码图片
let processed_image = "processed_captcha.png";

println!("正在处理图像...");
if let Err(e) = preprocess_image(input_image, processed_image) {
    eprintln!("图像预处理失败: {}", e);
    return;
}

println!("执行 OCR 识别...");
match recognize_text(processed_image) {
    Ok(text) => println!("识别出的验证码: {}", text),
    Err(e) => eprintln!("OCR 识别失败: {}", e),
}

}
3. 代码解析
3.1 预处理图像
转换为灰度图:减少颜色干扰,提高识别率。

二值化(Thresholding):将灰度图转换为黑白,提高对比度。

使用 image 和 imageproc 库 进行图像处理:

let gray = img.to_luma8();
let binary = threshold(&gray, 128);
3.2 OCR 解析
加载 Tesseract OCR:

let mut tess = LepTess::new(None, "eng")?;
设置图片并执行识别:

tess.set_image(image_path);
let text = tess.get_utf8_text()?;
使用 PageSegMode::SingleLine 提高验证码识别率。

  1. 运行程序
    确保 captcha.png 在项目目录下,然后运行:

cargo run
程序会加载验证码图像,进行处理并输出识别结果。

  1. 提高 OCR 识别率
    5.1 选择更合适的 PSM

tess.set_page_seg_mode(PageSegMode::SingleChar);
如果验证码是单个字符的,可以使用 SingleChar。

5.2 进一步优化图像
去噪

字符分割

使用更好的 Tesseract 训练数据

posted @ 2025-04-07 13:25  ttocr、com  阅读(23)  评论(0)    收藏  举报