- 环境准备
1.1 安装 Rust
如果尚未安装 Rust,可使用 Rust 官方安装工具
:更多内容访问ttocr.com或联系1436423940
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
安装完成后,检查 Rust 版本:
rustc --version
1.2 安装 Tesseract OCR
Windows
从 Tesseract GitHub
下载并安装。安装完成后,将 tesseract.exe 目录添加到环境变量。
Linux(Ubuntu)
sudo apt update
sudo apt install tesseract-ocr libtesseract-dev
macOS(Homebrew)
brew install tesseract
安装完成后,检查 Tesseract 是否安装成功:
tesseract --version
1.3 在 Rust 项目中引入 OCR 依赖
创建 Rust 项目:
cargo new captcha_reader
cd captcha_reader
编辑 Cargo.toml,添加以下依赖:
[dependencies]
leptess = "0.14" # Rust 的 Tesseract 绑定库
image = "0.24" # 处理图像
- Rust 代码实现
在 src/main.rs 中写入以下代码:
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.1 图像预处理
为了提高 OCR 识别率,我们进行以下优化:
转换为灰度图像,去除颜色干扰:
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("保存图像失败");
3.2 OCR 识别
初始化 Tesseract OCR:
let mut tess = LepTess::new(Some("/usr/share/tesseract-ocr/4.00/tessdata"), "eng").expect("无法初始化 Tesseract");
加载图像并执行 OCR:
tess.set_image(image_path);
tess.recognize().expect("OCR 识别失败");
tess.get_text().unwrap_or_else(|_| "识别失败".to_string()).trim().to_string()
- 运行程序
确保 captcha.png 放在程序目录下,然后运行:
cargo run
示例输出:
识别出的验证码: X7G9H
- 提高 OCR 识别率
5.1 设置 PSM 模式
Tesseract 提供不同的页面分割模式(PSM),可调整以优化验证码识别:
tess.set_variable(Variables::TesseditPagesegMode(6)).expect("设置 PSM 模式失败");
5.2 只识别数字和大写字母
tess.set_variable(Variables::TesseditCharWhitelist("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ")).expect("设置字符白名单失败");
5.3 更强的验证码预处理
如果验证码干扰较多,可以使用 OpenCV 进行边缘检测、去噪等处理。