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
Linux (Ubuntu)
bash

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

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

验证 Tesseract 是否安装成功:

bash

tesseract --version
1.3 创建 Rust 项目
bash

cargo new rust_ocr
cd rust_ocr
在 Cargo.toml 添加 tesseract 和 image 依赖:

toml

[dependencies]
tesseract = "0.17.0"
image = "0.24.6"
2. 代码实现
2.1 读取 & 处理图像
Rust 提供 image 库用于图像处理,我们对验证码进行灰度化和二值化处理,提高 OCR 识别率。

创建 src/main.rs,编写以下代码:

rust

use std::fs::File;
use std::path::Path;
use image::{DynamicImage, GrayImage, GenericImageView, Luma, open};
use tesseract::Tesseract;

fn preprocess_image(image_path: &str) -> GrayImage {
let img = open(image_path).expect("无法打开图像");

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

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

binary_img

}

fn save_processed_image(image: &GrayImage, output_path: &str) {
image.save(output_path).expect("无法保存处理后的图片");
}

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

let output_path = "processed_captcha.png";
save_processed_image(&processed_img, output_path);

// OCR 识别
let text = Tesseract::new(None, "eng")
    .expect("无法初始化 Tesseract")
    .set_image(output_path)
    .recognize()
    .expect("OCR 识别失败");

println!("识别出的验证码: {}", text);

}

fn main() {
let image_path = "captcha.png";
recognize_captcha(image_path);
}
3. 代码解析
3.1 图像预处理
灰度化:
rust

let gray_img = img.to_luma8();
二值化:
rust

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

image.save(output_path).expect("无法保存处理后的图片");
3.2 OCR 解析
初始化 Tesseract:
rust

let text = Tesseract::new(None, "eng")
设置图像路径并识别:
rust

.set_image(output_path)
.recognize()
4. 运行程序
确保 captcha.png 存在于项目目录下,然后编译并运行:

bash

cargo run
示例输出:

makefile

识别出的验证码: X7FQ8
5. 提高 OCR 识别准确率
5.1 设定 Tesseract PSM 模式
对于验证码推荐 PSM 6(假设单行文本):

rust

.set_variable("tessedit_pageseg_mode", "6")
5.2 设定字符白名单
如果验证码只包含数字和大写字母:

rust

.set_variable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ")
5.3 进一步图像优化
可以尝试:

去噪点(滤波处理)
字符分割(去除粘连字符)
6. 其他 OCR 方案
如果 Tesseract 识别率不够,可以使用 Leptonica 结合深度学习:

rust

use leptess::LepTess;

let mut ocr = LepTess::new(None, "eng").unwrap();
ocr.set_image("captcha.png");
let text = ocr.get_utf8_text().unwrap();
println!("识别出的验证码: {}", text);

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