使用 Rust 结合 Tesseract OCR 进行验证码识别
- 环境准备
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 提高验证码识别率
输出识别结果
- 运行程序
确保 captcha.png 存在,然后运行:
cargo run
程序会加载验证码图片,进行处理,并输出识别出的文本。
- 提高 OCR 识别率
优化 Tesseract 配置
tess.set_variable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ").unwrap();
去除噪点(可以使用 imageproc 进行形态学处理)
浙公网安备 33010602011771号