使用 Rust 与 Tesseract OCR 识别英文数字验证码

一、安装与配置

安装 Tesseract OCR

Ubuntu:
更多内容访问ttocr.com或联系1436423940
sudo apt-get update
sudo apt-get install tesseract-ocr

macOS:

brew install tesseract

Windows:
从 Tesseract 官方 GitHub
下载并安装 Windows 版本。

安装 Rust 的 tesseract 库

我们使用 Rust 的 tesseract crate 来与 Tesseract 进行交互。在终端中运行以下命令来安装该库:

cargo add tesseract

如果你没有安装 cargo,可以参考 Rust 官方安装文档
进行安装。

创建一个新的 Rust 项目

在你的工作目录下,创建一个新的 Rust 项目:

cargo new captcha_recognition
cd captcha_recognition

二、Rust 代码实现验证码识别
use tesseract::Tesseract;
use std::path::Path;

fn main() {
// 创建一个 Tesseract 实例
let mut tess = Tesseract::new(None, Some("eng")).expect("无法创建 Tesseract 实例");

// 设置要识别的验证码图片路径
let image_path = Path::new("captcha.jpg");

// 设置白名单:只允许字母和数字
tess.set_variable("tessedit_char_whitelist", "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
    .expect("设置字符白名单失败");

// 设置图片文件供 Tesseract 进行识别
tess.set_image(image_path).expect("无法加载图片");

// 获取识别的文本
let text = tess.get_text().expect("无法获取识别结果");

// 输出识别的文本
println!("识别结果: {}", text);

}

三、代码解析

创建 Tesseract 实例

使用 Tesseract::new() 创建一个新的 Tesseract 实例。这个实例会用于执行 OCR 识别。

None 表示我们没有设置 Tesseract 的配置文件路径。

Some("eng") 表示我们使用英语作为识别语言。

设置字符白名单

set_variable 方法允许我们设置一个字符白名单,以便 Tesseract 仅识别字母和数字。这有助于提高识别精度,尤其是当验证码只包含字母和数字时。

加载图像

使用 set_image 方法加载要进行识别的图像文件。这个方法将图像路径传递给 Tesseract 进行处理。

获取识别文本

使用 get_text 方法获取识别的结果。Tesseract 会尝试从图像中提取文本,并返回识别结果。

四、图像预处理(可选)

在某些情况下,验证码图像可能包含噪点或对比度较低,导致识别效果不理想。Rust 没有像 Python 那样丰富的图像处理库,但我们可以使用其他外部库,如 image 库,来对图像进行一些预处理。

添加 image crate

在 Cargo.toml 文件中,添加 image 库作为依赖:

[dependencies]
tesseract = "0.6"
image = "0.24"

图像预处理

在程序中进行图像灰度化或二值化,以提高识别效果:

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

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

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

// 可以做一些二值化或其他预处理操作
let mut processed_img = gray_img.clone();
for (x, y, pixel) in processed_img.enumerate_pixels_mut() {
    let luma = pixel.0[0];
    if luma > 128 {
        *pixel = Luma([255]); // 白色
    } else {
        *pixel = Luma([0]);   // 黑色
    }
}

processed_img

}

fn main() {
// 预处理图像
let processed_image = preprocess_image("captcha.jpg");

// 将处理后的图像保存为临时文件
let temp_path = "processed_captcha.png";
processed_image.save(temp_path).expect("保存预处理后的图像失败");

// 创建 Tesseract 实例
let mut tess = Tesseract::new(None, Some("eng")).expect("无法创建 Tesseract 实例");

// 设置白名单:只允许字母和数字
tess.set_variable("tessedit_char_whitelist", "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
    .expect("设置字符白名单失败");

// 设置处理后的图像
tess.set_image(Path::new(temp_path)).expect("无法加载处理后的图像");

// 获取识别的文本
let text = tess.get_text().expect("无法获取识别结果");

// 输出识别的文本
println!("识别结果: {}", text);

}

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