验证码学习笔记

1. 验证码的作用是:区分操作的对象是人还是机器。验证码信息是保存在服务器端的Session里面的。因此无法用程序将验证码从客户端中读取出来。

2. .Net图像处理基本知识:

????·使用Image.FromFile(file)加载一张图片,返回时Image类型,一般都可以转换为Bitmap子类使用。会智能识别图片格式。

????·Bitmap.save(),第二个参数为图片格式。可以实现图片格式转换功能。

????·除非图片以后还要用,否则要using处理Bitmap对象。

????·使用指针操作Bitmap效率最高,不过初学者不好理解,因此这次讲解简化的GetPixel【获得某个点上面的数据】、SetPixel【设置某个点上面的颜色。】

这里注意,使用GetPixel()和SetPixel()是更改内存里面的图片,并没有更改原图片,所以在使用完成之后,一定要记着保存。

范例1:

????

????·通过三颜色【RGB】获取颜色的值,使用Color.FromArgb()方法。

????·对图片颜色进行取反,即用255减去现有的颜色,如下图:

3. 实例:

????1. 处理图片,保存为tif格式:

????????1.1新建windows 窗体应用程序,拖出一个按钮,点击进去之后,如下代码:

????????private
void button1_Click(object sender, EventArgs e)

{

string[] files = Directory.GetFiles(@"K:\Net-学习资源\C#.Net教程\18-Tesseract验证码识别20130425\公开课软件、图片库和代码\样本图片和测试用图片\样本图片", "*gif");

for (int i = 0; i < files.Length; i++)

{

string file = files[i];

using (Bitmap bitmap = (Bitmap)Image.FromFile(file))

{

using (Bitmap newBitmap = Process(bitmap))

{

newBitmap.Save(@"I:\Desktop\YZMSB\Images\"+i+".tif",ImageFormat.Tiff);

}

}

}

}

????//处理干扰项

private
Bitmap Process(Bitmap bitmap)

{

Bitmap newBitmap = new
Bitmap(bitmap);

for (int x = 0; x < bitmap.Width; x++)

{

for (int y = 0; y < bitmap.Height; y++)

{

//去掉边框

if (x == 0 || y == 0 || x == bitmap.Width - 1 || y == bitmap.Height - 1)

{

newBitmap.SetPixel(x, y, Color.White);

}

else

{

Color color = bitmap.GetPixel(x,y);

if (color.Equals(Color.FromArgb(204, 204, 51)) || color.Equals(Color.FromArgb(153, 204, 51) )|| color.Equals(Color.FromArgb(204, 255, 102)) || color.Equals( Color.FromArgb(204, 255, 51)) || color.Equals( Color.FromArgb(204, 204, 204)))

{

newBitmap.SetPixel(x, y, Color.White);

}

else

{

newBitmap.SetPixel(x,y,color);

}

}

?

}

}

return newBitmap;

}

????2. 合并图片

????????2.1使用jTessBoxEditor.jar工具将多个图片合并成一个图片,如下:【注意:因为程序是用java编写的,所以必须配置java环境才能运行程序。】

????

Tools->Merge Tiff 然后选择你要合并的图片,最终保存为一张tif图片。

????3. 安装tesseract-ocr-setup-3.01-1.exe

????4. 进入dos窗口,进入合并后的图片文件夹中。然后执行命令:tesseract.exe haijia.tif haijia batch.nochop makebox,这样就对图片进行初步的识别,并将识别的信息保存到haijia.box文件里面。

????5. 然后再次打开jTessBoxEditor,点击"Open",选择haijia.tif,然后对图片进行手动修改。

????6. 执行命令:tesseract.exe haijia.tif haijia nobatch box.train

????7.执行命令:unicharset_extractor.exe haijia.box

????8. 在目录中新建一个名字为"font_properties"的文件,并输入文本(其中haijai是训练的名字,保存的时候使用EditPlus等高级文本编辑器去掉BOM头或者保存为ANSI格式):haijia 1 0 0 1 0

????9. 命令行执行cntraining.exe haijia.tr

????10. 命令行执行 mftraining.exe –F font_properties –U unicharset haijia.tr

????在第10步后遇到下面错误:【未解决】

????

????11. 目录下应该生成若干个文件,把unicharset,inteemp,normproto,pfftable这几个文件加上训练名字前缀"haijia."

????12.命令行执行"combine_tessdata haijia."生成的haijia.traineddata就可以用来识别了。

????13. 把haijia.traineddata拷到tesseract-ocr解压目录下的tessdata目录下。找一张经过和第二步一样处理过的图片,命令行执行tesseract.exe 1.jpg out –l haijia(使用haijia这个训练结果识别1.jpg这张图片,识别结果输出到out.txt)在文件夹下会生成一个out.txt,其中就是识别出的结果。

????14.在程序中添加引用:tesseract.dll,然后拖一个按钮控件,然后看如下代码:

????private
void button2_Click(object sender, EventArgs e)

{

????????//选择文件对象

OpenFileDialog ofd = new
OpenFileDialog();

if (ofd.ShowDialog() != System.Windows.Forms.DialogResult.OK)

{

return;

}

string file = ofd.FileName;

????????//这一块的代码要和处理图片时的代码一样。

using (Bitmap bitmap = (Bitmap)Image.FromFile(file))

{

using (Bitmap newBitmap =Process(bitmap))

{

TesseractProcessor processor = new
TesseractProcessor();

processor.SetPageSegMode(ePageSegMode.PSM_SINGLE_LINE);

processor.Init(@"学习库的路径【就是处理完后的.traineddata文件所在的文件夹】","haijia【训练集的名称】",(int)eOcrEngineMode.OEM_DEFAULT);

string result = processor.Recognize(newBitmap);

MessageBox.Show(result);

}

}

}

????下面是Tesseract原理:

????

时间: 2024-10-10 09:24:19

验证码学习笔记的相关文章

学习笔记:利用GDI+生成简单的验证码图片

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 学习笔记:利用GDI+生成简单的验证码图片 1 /// <summary> 2 /// 单击图片时切换图片 3 /// </summary> 4 /// <param name="sender">&

php学习笔记--验证码

php学习笔记--验证码 php培训教程中生成验证码的示例代码: <?php session_start();//生成验证码图片 Header("Content-type:image/PNG"); $im = imagecreate(44, 18); // 画一张指定宽高的图片 $back = imagecolorallocate($im, 245, 245, 245); // 定义背景颜色 imagefill($im, 0, 0, $back); //把背景颜色填充到刚刚画出来

MVC学习笔记索引帖

[MVC学习笔记]1.项目结构搭建及单个类在各个层次中的实现 [MVC学习笔记]2.使用T4模板生成其他类的具体实现 [MVC学习笔记]3.使用Spring.Net应用IOC(依赖倒置) [MVC学习笔记]4.使用Log4Net来进行错误日志的记录 [MVC学习笔记]5.使用Controller来代替Filter完成登录验证(Session校验) [MVC学习笔记]6. 使用Memcache+Cookie解决分布式系统共享登录状态 [MVC学习笔记]7.使用极验验证来制作更高逼格的验证码

ID卡学习笔记

前言: 我也来篇关于当时学习ID卡的笔记.前段时间小区装门禁.一个钮扣型的ID卡就要30块.非常黑心.因为其ID卡的成本也就是1块钱以下.因此我也加入到这方面的研究.用来模拟ID卡的T5557卡成本2块钱左右.可反复写.文章想到什么就写什么.大牛可以忽视. 两天前入手了一套ID读卡器.不知型号.没有参数.没有出厂.就一小光盘.里面是CP210x驱动与读写软件. CP210x驱动可以把USB模拟成COM串口.以下是我的设备图: 虽然提供了win7驱动.但软件不能在win7下运行.所以只能在vbox

公益图书馆-学习笔记

1.HTML <caption> 标签 caption 标签必须紧随 table 标签之后.您只能对每个表格定义一个标题.通常这个标题会被居中于表格之上. <table border="6"> <caption>表格标题</caption> 2.模板继承是thinkphp的一项更加灵活的模板布局方式,模板继承不同于模板布局. 模板可以定义一个基础模板,并且定义相关的区块(block),然后继承(extend)该基础模板的子模板中就可以对基

VS2013中Python学习笔记[Django Web的第一个网页]

前言 前面我简单介绍了Python的Hello World.看到有人问我搞搞Python的Web,一时兴起,就来试试看. 第一篇 VS2013中Python学习笔记[环境搭建] 简单介绍Python环境的搭建过程,以及Hello World的实现. 第二篇 VS2013中Python学习笔记[基础入门] 我简单学习使用了Python的几个基础的知识点. 第一个Web页面 第一步:首先打开VS2013开发工具 ,新建项目,选择Django Project模版. 修改项目名称,可以查看到项目的文件结

Ext.Net学习笔记07:Ext.Net DirectMethods用法详解

前面两篇内容中,我们看到了DirectEvents方便调用服务器端方法.DirectEvents调用WebService方法的使用方法,今天我们来看看DirectMethods,这家伙可比DirectEvents更加灵活了,它可以像调用JS方法一样来异步调用服务器端的方法. 使用DirectMethods在JS中调用C#方法 我承认,这个标题有点噱头,其实应该是通过DirectMethods,在JS中通过异步调用的方式执行服务器端的方法. 来看一个例子吧: [DirectMethod] publ

C#中面向对象编程机制之多态学习笔记

C#的多态性: 我的理解是:同一个操作,作用于不同的对象时,会有不同的结果,即同一个方法根据需要,作用于不同的对象时,会有不同的实现. C#的多态包括:接口多态,继承多态. 其中继承多态又包括通过虚拟方法实现的多态和通过抽象方法实现的多态性 例如:基类动物都有吃的方法,但是不同的动物吃的东西就会不一样,例如狼吃肉,羊吃草,这样"吃"的这个方法就要在派生类里面重新实现以下,运行时,通过指向基类的指针,来调用实现派生类中的方法. 接下来举例实现多态性. 1. 接口多态性 把动物"

python3.x学习笔记2018-02-02更新

前言:python3.x部分学习笔记,有意交流学习者可加wechat:YWNlODAyMzU5MTEzMTQ=.如果笔记内容有错,请指出来. *** 对数据类型的操作 可变数据类型:列表,集合,字典 列表: ``` li=['a','b'] 增: li.insert(2,'c') #在序号2位置上插入'c' li.append('d') #在列表末尾添加'd' li.extend(li2) #在列表li后面添加li2 删: li.remove('c') del li[2] li.pop(3) 改