使用 Rust 进行验证码识别:结合 Tesseract OCR 进行文本解析

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

bash

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
安装完成后,检查 Rust 版本:

bash

rustc --version
1.2 安装 Tesseract OCR
Windows
从 Tesseract GitHub 下载并安装。安装完成后,将 tesseract.exe 目录添加到环境变量。

Linux(Ubuntu)
bash
更多内容访问ttocr.com或联系1436423940
sudo apt update
sudo apt install tesseract-ocr libtesseract-dev
macOS(Homebrew)
bash

brew install tesseract
安装完成后,检查 Tesseract 是否安装成功:

bash

tesseract --version
1.3 在 Rust 项目中引入 OCR 依赖
创建 Rust 项目:

bash

cargo new captcha_reader
cd captcha_reader
编辑 Cargo.toml,添加以下依赖:

toml

[dependencies]
leptess = "0.14" # Rust 的 Tesseract 绑定库
image = "0.24" # 处理图像
2. Rust 代码实现
在 src/main.rs 中写入以下代码:

rust

use leptess::{LepTess, Variables};
use image::{DynamicImage, GenericImageView, Luma, imageops::grayscale};
use std::fs::File;
use std::io::BufWriter;

fn preprocess_image(input_path: &str, output_path: &str) {
let img = image::open(input_path).expect("无法打开图像文件");

// 转换为灰度图像
let gray_img = grayscale(&img);

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

// 保存处理后的图像
let output_file = File::create(output_path).expect("无法创建输出文件");
let writer = BufWriter::new(output_file);
binary_img.save(writer, image::ImageFormat::Png).expect("保存图像失败");

}

fn recognize_captcha(image_path: &str) -> String {
let mut tess = LepTess::new(Some("/usr/share/tesseract-ocr/4.00/tessdata"), "eng").expect("无法初始化 Tesseract");
tess.set_image(image_path);
tess.recognize().expect("OCR 识别失败");
tess.get_text().unwrap_or_else(|_| "识别失败".to_string()).trim().to_string()
}

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

// 预处理图像
preprocess_image(input_path, processed_path);

// OCR 识别
let result = recognize_captcha(processed_path);
println!("识别出的验证码: {}", result);

}
3. 代码解析
3.1 图像预处理
为了提高 OCR 识别率,我们进行以下优化:

转换为灰度图像,去除颜色干扰:
rust

let gray_img = grayscale(&img);
二值化处理,增强对比度:
rust

let threshold = 128;
let binary_img = gray_img.map_pixels(|_, _, p| {
if p[0] > threshold { Luma([255]) } else { Luma([0]) }
});
保存处理后的图像:
rust

let output_file = File::create(output_path).expect("无法创建输出文件");
let writer = BufWriter::new(output_file);
binary_img.save(writer, image::ImageFormat::Png).expect("保存图像失败");
3.2 OCR 识别
初始化 Tesseract OCR:
rust

let mut tess = LepTess::new(Some("/usr/share/tesseract-ocr/4.00/tessdata"), "eng").expect("无法初始化 Tesseract");
加载图像并执行 OCR:
rust

tess.set_image(image_path);
tess.recognize().expect("OCR 识别失败");
tess.get_text().unwrap_or_else(|_| "识别失败".to_string()).trim().to_string()
4. 运行程序
确保 captcha.png 放在程序目录下,然后运行:

bash

cargo run
示例输出:

makefile

识别出的验证码: X7G9H
5. 提高 OCR 识别率
5.1 设置 PSM 模式
Tesseract 提供不同的页面分割模式(PSM),可调整以优化验证码识别:

rust

tess.set_variable(Variables::TesseditPagesegMode(6)).expect("设置 PSM 模式失败");
5.2 只识别数字和大写字母
rust

tess.set_variable(Variables::TesseditCharWhitelist("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ")).expect("设置字符白名单失败");
5.3 更强的验证码预处理
如果验证码干扰较多,可以使用 OpenCV 进行边缘检测、去噪等处理。

posted @ 2025-03-17 21:08  ttocr、com  阅读(13)  评论(0)    收藏  举报