Rust 结合 Tesseract OCR 解析验证码

news/2025/3/15 20:22:20/文章来源:https://www.cnblogs.com/ocr12/p/18774137
  1. 环境准备
    1.1 安装 Rust
    Rust 可以通过 Rust 官方网站 下载并安装,或者使用 rustup:

bash

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

bash

rustc --version
1.2 安装 Tesseract OCR
Windows
从 Tesseract GitHub 下载并安装。

Linux(Ubuntu)
bash

sudo apt install tesseract-ocr
macOS(Homebrew)
bash

brew install tesseract
安装完成后,检查是否成功安装:

bash

tesseract --version
1.3 创建 Rust 项目
使用 Cargo 创建 Rust 项目:

bash

cargo new captcha_reader
cd captcha_reader
在 Cargo.toml 文件中添加 Tesseract 依赖:

toml

[dependencies]
leptess = "0.14" # Rust 的 Tesseract OCR 绑定库
image = "0.24" # 处理图像的库
2. 代码实现
在 src/main.rs 文件中写入以下代码:

rust

use leptess::LepTess;
use std::path::Path;

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

// 创建 Tesseract OCR 客户端
let mut ocr = LepTess::new(None, "eng").expect("无法初始化 Tesseract");// 设定要识别的图像
ocr.set_image(Path::new(image_path));// 进行 OCR 识别
match ocr.get_utf8_text() {Ok(text) => println!("识别出的验证码: {}", text.trim()),Err(e) => eprintln!("OCR 识别失败: {}", e),
}

}
3. 代码解析
3.1 读取图像并调用 Tesseract
rust

let mut ocr = LepTess::new(None, "eng").expect("无法初始化 Tesseract");
LepTess::new(None, "eng") 用于创建 OCR 识别实例,默认使用英语训练数据。
3.2 设定图像并进行识别
rust

ocr.set_image(Path::new(image_path));
指定待识别的验证码图片。
rust

ocr.get_utf8_text()
进行 OCR 识别并返回文本结果。
4. 运行程序
确保 captcha.png 存在于项目目录下,然后运行:

bash

cargo run
示例输出:

makefile

识别出的验证码: X7G9H
5. 提高 OCR 识别率
5.1 使用不同的 Tesseract PSM 模式
rust

ocr.set_variable("tessedit_pageseg_mode", "6").unwrap();
PSM 6 适用于验证码识别,提高准确率。
5.2 限制识别字符集
rust

ocr.set_variable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ").unwrap();
让 Tesseract 只识别数字和大写字母,提高精确度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/899363.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【水】洛谷 P3913 (待续)

今天NaN在刷水题时碰到这么一道题:洛谷P3913 https://www.luogu.com.cn/problem/P3913 代码的思路特别简单:用全部格子数 - 没被車侵占的行数 \(\times\) 列数即可. code void solve() {cin >> n >> k;g = h = n;for (ll i = 1; i <= k; i++){cin >> x …

web77笔记(POST+FFI)

web77 命令执行最后一题,php7.4 FFI,php7.4以上才有 https://www.php.net/manual/zh/ffi.cdef.php https://www.php.cn/php-weizijiaocheng-415807.html $ffi = FFI::cdef("int system(const char *command);");//创建一个system对象 $a=/readflag > 1.txt;//没…

day:22 python函数——介绍及自定义函数运用

一.函数的定义 函数是组织好,可以重复使用,用来实现单一,或者关联功能的代码段 二.pycharm中运用的结构三.函数的优点? a.降低代码的冗余 b.增加代码的复用性,提高开发效率 c.提高程序的拓展性 d.把代码片段放在函数当中 四.定义函数 (1)自定义函数 (一)自定义函数 a.函数格式…

英语单词音标重读符号读法作用

比如explicit,重读的是`后面的第一个元音即i

量子网络操作系统 QNodeOS 资料收集

2025年3月14日,通过科技日报的报道知道了这个量子计算领域的重大突破 —— 全球首个量子网络操作系统 QNodeOS 问世。欧洲的量子互联网联盟(QIA)的研究人员2025年3月12日在《自然》(Nature)杂志上发表了论文 An operating system for executing applications on quantum n…

Typora的基本的一些使用用法

markdown 标题 二级标题 (在最前面两个#号加空格) 三级标题 (在最前面三个#号加空格) 字体 Hello,World!(粗体:两边各两个星号) Hello,World!(斜体:两边各一个星号) Hello,World!(粗体加斜体:两边各三个星号) Hello,World!(删除体:两边各两个波浪号) 引用(大于加…

http--nodejs原生web服务

创建http服务const http = require(node:http) const url = require(node:url)http.createServer((req, res) => {}).listen(98, () => {console.log(server is running on port 98) }) 区分请求方法 例如常见的 POST、GET req表示前端的入参(请求参数)。 res 表示后…

Windows server 中 静默安装SQL SERVER 数据库 命令 参数

这篇文章记录一下自己如何在Windows Server Core上安装和配置SQL Server。 安装之前的检查 安装SQL Server的操作系统要求检查 第一件事是需要仔细检查SQL Server的要求文档,这个文档里详细的列出了目前SQL Server支持的操作系统版本,最重要的一条就是检查当你在使用云上的虚…

(3).工厂方法模式

我们接上一个模式的实例: (1).创建水果接口 IFruit:1 namespace 工厂方法模式2 {3 public interface IFruit4 {5 /// <summary>6 /// 水果的单价7 /// </summary>8 double Amount { get; }9 10 11 /// <s…

nestjs Provider

Nest 实现了 IoC 容器,会从入口模块开始扫描,分析 Module 之间的引用关系,对象之间的依赖关系,自动把 provider 注入到目标对象以上部分只是简写{provide: AppService,useClass: AppService }两种注入方式构造器注入属性注入全局模块一般来说,我们都是在需要导出的模块的m…

FastAPI+CrewAI+MySQL+Celery实现AI Agent复杂工作流

FastAPI+CrewAI+MySQL+Celery实现AI Agent复杂工作流 https://github.com/fanqingsong/CrewAIFlowsFullStack本项目主要实现使用FastAPI后端框架+CrewAI实现AI Agent复杂工作流。代码实现CrewAI的Flows功能,并支持Flow运行中间结果进行持久化存储和查询(MySQL),支持多Flow并行…

石家庄地铁收费app

先建立一个项目,项目结构如图所示先编写app页面activity_main.xml,包括其输入框和按钮<TextViewandroid:id="@+id/tvStartStation"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="起点站&quo…