使用Tesseract (OCR)实现简单的验证码识别(C#)+窗体淡入淡出效果

来园子也有一段时间了,一直没时间写点东西,说实话刚开始也不知道写什么,一直以来对验证码识别比较感兴趣,曾经想着自己处理图形实现识别验证码,不过感觉对我来说太难了,偶然中再网上发现了Tesseract,于是就想借助Tesseract 来实现简单验证码的识别,正好今天周末有时间写了这点东西。

1、Tesseract介绍:

Tesseract的OCR引擎最先由HP实验室于1985年开始研发,至1995年时已经成为OCR业内最准确的三款识别引擎之一。然而,HP不久便决定放弃OCR业务,Tesseract也从此尘封。数年以后,HP意识到,与其将Tesseract束之高阁,不如贡献给开源软件业,让其重焕新生--2005年,Tesseract由美国内华达州信息技术研究所获得,并求诸于Google对Tesseract进行改进、消除Bug、优化工作。

2、下载Tesseract:

http://code.google.com/p/tesseract-ocr/downloads/list,可以到这里下载一些识别必须的文件。

3、编写代码:

Tesseract可以在命令行中运行,但觉得不太好用,于是就通过代码调用DOS命令实现图像识别

复制代码
 1                 using System.Diagnostics;
2 Process p = new Process();
3 p.StartInfo.FileName = "cmd.exe ";
4 p.StartInfo.UseShellExecute = false;
5 p.StartInfo.RedirectStandardInput = true;
6 p.StartInfo.RedirectStandardOutput = true;
7 p.StartInfo.RedirectStandardError = true;
8 p.StartInfo.CreateNoWindow = true;
9
10 p.Start();
11 string cmd = "tesseract.exe " + PicPath + " " + filename + " -l chi_sim";//主要这句代码在起作用
12 p.StandardInput.WriteLine(cmd);
13 p.Close();
复制代码

 

图片识别以后会把识别的内容保存在一个txt文件中,我们可以通过代码将保存在txt文件中的内容读出来,直观的显示出来

读取txt文件

1         public static string LoadDataFromTXT(string filePath)
2 {
3 string[] line = System.IO.File.ReadAllLines(filePath);
4 return line[0];
5 }

 

这样运行以后就可以看到这样的效果             

 

经过多次实验发现对于这种简单的数字验证码,识别正确率还是非常高的,但是对于我们中华民族博大精深的汉字,它表现的是否也如此优秀呢?那就让我们来做一下实验。。

在网上随便截一张带有汉字的图片:

 

让我们来看看汉字的识别效果吧:

大家看了一定很失望吧,对于汉字不是太给力,得到的结果乱七八糟,根本不能用,还要有很大的改进之处啊。。。不过它还是为我们识别一般验证码提供了方便。。

 

到这也基本讲完了,顺便讲一下如何实现窗体淡入淡出效果

复制代码
using System.Runtime.InteropServices;
public class Win32
{
public const Int32 AW_HOR_POSITIVE = 0x00000001; // 从左到右打开窗口
public const Int32 AW_HOR_NEGATIVE = 0x00000002; // 从右到左打开窗口
public const Int32 AW_VER_POSITIVE = 0x00000004; // 从上到下打开窗口
public const Int32 AW_VER_NEGATIVE = 0x00000008; // 从下到上打开窗口
public const Int32 AW_CENTER = 0x00000010;
public const Int32 AW_HIDE = 0x00010000; // 在窗体卸载时若想使用本函数就得加上此常量
public const Int32 AW_ACTIVATE = 0x00020000; //在窗体通过本函数打开后,默认情况下会失去焦点,除非加上本常量
public const Int32 AW_SLIDE = 0x00040000;
public const Int32 AW_BLEND = 0x00080000; // 淡入淡出效果
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern bool AnimateWindow(
IntPtr hwnd, // handle to window
int dwTime, // duration of animation
int dwFlags // animation type
);
}
Win32.AnimateWindow(this.Handle, 1000, Win32.AW_BLEND);//淡入
Win32.AnimateWindow(this.Handle, 1000, Win32.AW_SLIDE | Win32.AW_HIDE | Win32.AW_BLEND);//淡出
复制代码

 

效果呢就是这样:

至此全部结束,第一次写东西也不知道怎么写,也没什么技术含量,不过还是希望和大家一起学习,一起进步,有什么问题、指教请留言。。。

 

posted @   你的创可贴  阅读(3715)  评论(7编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
快递查询
点击右上角即可分享
微信分享提示