使用 Rust 和 Tesseract OCR 解析验证码
- 环境准备
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
程序会处理验证码图片并输出识别结果。
- 提高识别准确率
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 进一步去除噪点
字符分割:适用于粘连字符的验证码
浙公网安备 33010602011771号