验证码学习笔记
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原理: