验证码学习笔记

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原理:

    

posted @ 2015-07-30 21:10  Bronc_Li  阅读(364)  评论(0编辑  收藏  举报