使用 Rust 和 Tesseract OCR 解析验证码

  1. 环境准备
    1.1 安装 Rust
    如果尚未安装 Rust,可以使用官方推荐的 rustup 进行安装:

bash

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

bash

rustc --version
1.2 安装 Tesseract OCR
在不同操作系统上安装 Tesseract:

macOS(使用 Homebrew):

brew install tesseract
Ubuntu/Linux:

sudo apt update
sudo apt install tesseract-ocr
Windows(使用 Scoop):

bash

scoop install tesseract
安装完成后,检查 Tesseract 是否可用:

bash

tesseract --version
1.3 创建 Rust 项目
创建一个新的 Rust 项目:

bash

cargo new rust_ocr
cd rust_ocr
然后在 Cargo.toml 中添加依赖:

toml

[dependencies]
image = "0.24"
tesseract = "0.14"
image 处理图像
tesseract 绑定到 Tesseract OCR
2. 代码实现
在 src/main.rs 中添加以下代码:

use image::{GrayImage, Luma, ImageBuffer};
use tesseract::Tesseract;
use std::path::Path;
use std::fs::File;
use std::io::BufReader;

/// 读取验证码图片
fn load_captcha_image(image_path: &str) -> GrayImage {
let img = image::open(image_path).expect("无法打开图片").into_luma8();
img
}

/// 预处理图像(灰度化 + 二值化)
fn preprocess_image(img: &GrayImage) -> GrayImage {
let mut processed = ImageBuffer::new(img.width(), img.height());

for (x, y, pixel) in img.enumerate_pixels() {
    let new_pixel = if pixel[0] > 128 { Luma([255]) } else { Luma([0]) };
    processed.put_pixel(x, y, new_pixel);
}

processed

}

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

/// 进行 OCR 识别
fn recognize_text(image_path: &str) -> String {
let text = Tesseract::new(None, "eng")
.expect("无法初始化 Tesseract")
.set_image(image_path)
.recognize()
.expect("OCR 识别失败");

text.trim().to_string()

}

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

println!("加载验证码图片...");
let img = load_captcha_image(image_path);

println!("预处理图像...");
let processed_img = preprocess_image(&img);
save_image(&processed_img, processed_path);

println!("执行 OCR 识别...");
let text = recognize_text(processed_path);

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

}
3. 代码解析
3.1 读取并预处理图像
rust

let img = image::open(image_path).expect("无法打开图片").into_luma8();
将图片转换为灰度
二值化 处理,增强字符对比度
3.2 调用 Tesseract 进行 OCR 解析
rust

let text = Tesseract::new(None, "eng")
.expect("无法初始化 Tesseract")
.set_image(image_path)
.recognize()
.expect("OCR 识别失败");
调用 Tesseract
设置语言 为 "eng"
识别验证码文本
4. 运行程序
执行:

bash

cargo run
程序会处理验证码图片并输出识别结果。

  1. 提高识别准确率
    5.1 调整 Tesseract PSM 模式
    不同的 PSM 模式适用于不同场景:

PSM 6:假设为单行文本
PSM 7:单行纯文本(更适合验证码)
PSM 10:单字符模式(适用于分割验证码)
可以调整:

rust

Tesseract::new(None, "eng")
.expect("无法初始化 Tesseract")
.set_image(image_path)
.set_variable("tessedit_pageseg_mode", "7")
.recognize()
.expect("OCR 识别失败");
5.2 进一步图像优化
降噪处理:使用 OpenCV 进一步去除噪点
字符分割:适用于粘连字符的验证码

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