在上一篇《C#识别简单的验证码(上)》中,我们给出了验证码识别的方法步骤。实际上是可以分为训练,建立样本库和识别两个部分,在本篇中将讲如何用C#实现训练和建立样本库。
回顾上一篇所讲的方法,训练和建立样本库可以由如下流程图来表示:
下面将就流程图中每一部分进行说明。
1. 获取图像:
图像有两种来源,一种是来源于本地文件。下面的代码将会打开一个对话框让用户选择含有验证码的图片,并且显示在PictureBox控件中
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog fileNames = new OpenFileDialog();
fileNames.Filter = "All files (*.*)|*.*|JPG files (*.jpg)|*.jpg";
fileNames.RestoreDirectory = true;
if(fileNames.ShowDialog()==DialogResult.OK)
{
filePath = fileNames.FileName.ToString();
fileName = filePath.Substring(filePath.LastIndexOf("\\") + 1);
pictureBox1.Image = Image.FromFile(filePath);
bmp = new Bitmap(Image.FromFile(filePath)) ;
}
}
还有一种是来源于网络,这里假设验证码的地址是http://www.xxx.com/aa.jpg,则可以用下面的代码来加载验证码。
WebBrowser web = new WebBrowser();
web.Navigate("https://www.xxx.com/aa.jpg");
web.Navigated += new WebBrowserNavigatedEventHandler(download_image);
private void download_image(object sender, WebBrowserNavigatedEventArgs e)
{
//遍历寻找验证图像所在元素
foreach (HtmlElement f in web.Document.Images)
{
if (f.GetAttribute("src").ToLower().EndsWith(".jpg"))
{
//将元素绝对定位到页面左上角
f.Style = "position: absolute; z-index: 9999; top: 0px; left: 0px";
//抓图
var b = new Bitmap(f.ClientRectangle.Width, f.ClientRectangle.Height);
web.DrawToBitmap(b, new Rectangle(new Point(), f.ClientRectangle.Size));
pictureBox1.Image = b;
bmp = b;
break;
}
}
}
2. 图像灰度化
/// <summary>
/// 图像灰度化
/// </summary>