使用 C# 和 Tesseract 实现验证码识别

news/2025/1/26 15:53:11/文章来源:https://www.cnblogs.com/ocr12/p/18691896

验证码(CAPTCHA)在许多网站中用来防止自动化脚本的恶意访问。虽然验证码的目的是阻止机器人,但在某些应用场景下,我们可能需要通过自动化工具识别验证码。本文将介绍如何使用 C# 和 Tesseract OCR 引擎来识别验证码。

  1. 环境准备
    安装 Tesseract OCR
    首先,需要安装 Tesseract OCR 引擎。根据你的操作系统,安装方法如下:

Windows:从 Tesseract 官方 GitHub 页面 下载 Windows 安装包。
Linux:使用以下命令安装:

sudo apt-get install tesseract-ocr
macOS:使用 Homebrew 安装:
bash

brew install tesseract
安装完成后,你可以通过命令行验证 Tesseract 是否安装成功:

bash

tesseract --version
安装 C# 项目依赖
在 C# 项目中,我们可以使用 Tesseract 这个 NuGet 包来调用 Tesseract 引擎。可以通过 NuGet 包管理器安装:

bash

Install-Package Tesseract
或者通过命令行安装:

bash

dotnet add package Tesseract
2. 编写验证码识别代码
以下是一个简单的 C# 程序,演示如何使用 Tesseract OCR 引擎来识别验证码:

csharp

using System;
using Tesseract;
using System.Drawing;

class CaptchaRecognition
{
static void Main(string[] args)
{
// 设置 Tesseract 数据文件路径
string tessdataPath = @"C:\Program Files\Tesseract-OCR\tessdata"; // 修改为 Tesseract 数据文件夹的路径

    // 初始化 Tesseract OCR 引擎using (var engine = new TesseractEngine(tessdataPath, "eng", EngineMode.Default)){// 读取验证码图像using (var img = Pix.LoadFromFile("captcha.png")){// 使用 Tesseract 进行 OCR 识别var result = engine.Process(img);// 输出识别结果Console.WriteLine("识别的验证码是: " + result.GetText().Trim());}}
}

}
3. 图像预处理
为了提高识别的准确率,我们可以对图像进行一些常见的预处理操作。这些操作包括灰度化、二值化和去噪。Tesseract 在处理这些预处理过的图像时,通常能够获得更高的识别精度。

以下是一些常见的图像预处理方法:

  1. 灰度化
    将图像从彩色转换为灰度,这样可以减少颜色对字符的干扰。

  2. 二值化
    将图像转换为黑白两种颜色,提高字符和背景之间的对比度。常用的算法是 Otsu 阈值法。

  3. 去噪
    使用滤波器去除图像中的噪点,确保字符的边缘更加清晰。

你可以使用 C# 中的 System.Drawing 库或第三方图像处理库,如 OpenCvSharp,进行这些预处理。

以下是一个简单的使用 System.Drawing 进行灰度化和二值化的示例:

csharp

using System.Drawing;
using System.Drawing.Imaging;

public static Bitmap PreprocessImage(string imagePath)
{
// 读取图像
Bitmap img = new Bitmap(imagePath);

// 转为灰度图像
for (int i = 0; i < img.Width; i++)
{for (int j = 0; j < img.Height; j++){Color pixelColor = img.GetPixel(i, j);int grayValue = (int)(pixelColor.R * 0.3 + pixelColor.G * 0.59 + pixelColor.B * 0.11);img.SetPixel(i, j, Color.FromArgb(grayValue, grayValue, grayValue));}
}// 二值化图像
for (int i = 0; i < img.Width; i++)
{for (int j = 0; j < img.Height; j++){Color pixelColor = img.GetPixel(i, j);int binaryValue = (pixelColor.R < 128) ? 0 : 255;img.SetPixel(i, j, Color.FromArgb(binaryValue, binaryValue, binaryValue));}
}return img;

}
在 Main 函数中调用 PreprocessImage 来进行图像预处理:

csharp

using (var img = Pix.LoadFromFile("captcha.png"))
{
// 预处理图像
Bitmap preprocessedImage = PreprocessImage("captcha.png");

// 将预处理后的图像保存为临时文件
preprocessedImage.Save("processed_captcha.png");// 使用 Tesseract 进行识别
var result = engine.Process(Pix.LoadFromFile("processed_captcha.png"));
Console.WriteLine("识别的验证码是: " + result.GetText().Trim());

}
4. 提高识别准确率
虽然 Tesseract 是一个强大的 OCR 引擎,但它在处理复杂的验证码时可能会遇到问题。以下是一些常见的提高识别准确度的方法:

  1. 使用字符白名单
    如果验证码只包含数字或字母,可以通过设置字符白名单来限制 Tesseract 只识别这些字符,从而提高识别准确度。

csharp

engine.SetVariable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
2. 调整 OCR 参数
Tesseract 提供了许多参数配置项来帮助优化识别过程。例如,psm(页面分割模式)可以用来选择最适合验证码类型的布局模式。

csharp

engine.SetVariable("tessedit_pageseg_mode", "6"); // 6代表单行文本
常见的 psm 模式包括:

psm 3: 默认模式,适用于普通文本。
psm 6: 用于处理包含单一文本块的图像。
psm 11: 用于处理稀疏文本。
3. 图像分割
对于包含多个字符的验证码,图像分割是一个有效的策略。可以将验证码图像分割成单个字符,然后分别对每个字符进行 OCR 识别,最后组合识别结果。
更多内容访问ttocr.com或联系1436423940
4. 自定义训练
如果验证码字体特殊或不规则,可以通过 Tesseract 提供的训练功能,创建一个自定义的识别模型,以提高识别的精度。

  1. 运行程序
    保存代码为 CaptchaRecognition.cs,并确保 Tesseract 可执行文件路径正确。将验证码图像(例如 captcha.png)放在项目目录中。然后,使用以下命令编译并运行程序:

bash
更多内容访问ttocr.com或联系1436423940
csc CaptchaRecognition.cs
CaptchaRecognition.exe
运行成功后,程序会输出类似以下内容:

makefile

识别的验证码是: X9D2A

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

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

相关文章

Python数据格式转换神器-提高办公效率

Python办公技巧,数据转换神器,提升工作效率一、引言在工作日常里,数据转换总是让人头疼?别急,今天揭秘一个超级实用的Python技巧,帮你轻松搞定各种数据格式转换,提升工作效率不是梦! 场景1:你手头有一堆CSV格式的(逗号分隔符)数据,其他部门或公司需要你提供其中几列关…

Python Functools模块

代码:#coding=utf-8import functools from functools import cache from functools import cached_property, lru_cache from functools import partial, partialmethod from functools import singledispatch, singledispatchmethod from functools import update_wrapper, w…

F12调试应用:强行查看洛谷个人主页

1.前言 众所周知,洛谷的个人主页常常有些不得了的东西,但是:(洛谷估值第二名%%%)这个系统维护每次都拦着我们。 有一个比较常用的方法就是删掉域名.cn,访问外国服务器(天天炸)。所以必须要有更可靠的方法。 2.F12大法妙 这时候,我们就可以按下F12打开检查。按下左上角…

【AI+安全】看不见的AI安全威胁,揭秘隐形提示注入风险

在人工智能蓬勃发展并融合到各行各业的当前,一种新型的威胁正悄然蔓延:隐形提示注入攻击。这种看不见的攻击手段,利用了用户肉眼无法识别的特殊字符,悄无声息地影响着大语言模型的行为。它就像一个隐藏在阴影中的刺客,偷偷操纵强大的 AI 系统做出意想不到的危险行为。 如果…

unity shader 消融效果

消融效果 基础消融效果原理多方向和可控消融

React中的数据流管理

我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品。我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值。本文作者:霜序前言💡 为什么数据流管理重要? React 的核心思想为:UI=render(data) ,data 就是所谓的数据,render 是 React 提供的纯函…

代码随想录算法训练营第9天 | 151.翻转字符串里的单词、右旋字符串、28. 实现 strStr()、重复的子字符串、字符串:总结篇、双指针回顾

一、刷题部分 1.1 151.翻转字符串里的单词原文链接:代码随想录 题目链接:151. 反转字符串中的单词 - 力扣(LeetCode)1.1.1 题目描述 给你一个字符串 s ,请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。…

《CPython Internals》阅读笔记:p360-p377

《CPython Internals》学习第 20 天,p360-p377 总结,总计 18 页。 一、技术总结 1.seaborn 可视化工具。 2.dtrace (1)安装 sudo apt-get install systemtap-sdt-dev(2)编译 ./configure --with-dtrace make clean make3.snakeviz 适用于 cProfile 的可视化工具。 二、英语总…

goland2024如何安装?附安装包和激活方式

前言 大家好,我是小徐啊。goland是我们开发Go语言时的常用的开发工具,功能强大,今天,小徐就来介绍下如何安装和获取激活方式。文末附获取方式。 如何安装和激活goland 首先,我们双击下goland2024安装包,开始安装。然后,我们点击下运行按钮。然后,我们点击下一步按钮。然…

AI实现个人阅读网页插件

背景 日常工作中经常需要浏览各种Github项目或者一些网页,逐字逐句看总觉得不够效率,如果在每次打开一个新的页面时就能够掌握大概的内容,然后再决定是否深入阅读就方便多了。有了这样的念头后,总想自己开发一款简单的浏览器插件,但是始终没有提上日程。目前随着AI编程工具…

RabbitMQ之Exchange、Queue参数详解

1.先来介绍RabbitMQ中的成员Producer(生产者): 将消息发送到Exchange Exchange(交换器):将从生产者接收到的消息路由到Queue Queue(队列):存放供消费者消费的消息 BindingKey(绑定键):建立Exchange与Queue之间的关系(个人看作是一种规则,也就是Exchange将什么样的消息路由…

[日记]轻量回测框架 Backtesting.py 与 Streamlit集成

找到一个目前觉得比较轻量级的框架,结构简单易用,几行代码搞定即可搞定回测。 对于回测结果提供可视化的找到一个目前觉得比较轻量级的框架,结构简单易用,几行代码搞定即可搞定回测。 对于回测结果提供可视化的图表分析。如下图:同时提供常用的收益和风险指标数据作为量化…