| 网站首页 | VB.Net实例分析 | .Net技术文摘 | 下载中心 | VB.Net书籍笔记 | .Net源码 | VBS脚本与组件调用 | Windows2008技术文摘 | 给我们留言 | 
最新公告:

  没有公告

您现在的位置: 乐博网 >> VB.Net应用技巧 >> 技术文摘正文
最新推荐 更多内容
[组图]图片验证码识别思路和方法(VB.Net)
图片验证码识别思路和方法(VB.Net)
作者:ntdrv    来源:ntdrv的博客     更新时间:2010-6-28

除了本文关于图片验证码识别的思路,乐博网还有一篇关于图片验证码的文章和源代码,

访问地址:         VB.Ne图形验证码识别的源代码

图片验证码识别思路和方法(VB.Net) 由乐博网自转载 www.ntdrv.cn/Blog/Article.aspx?ID=2311

       投票软件比较有技术含量的部分就在验证码识别。为防止投票作弊,很多投票网站都会加随机验证码,输入验证码后才能投票。但是加了验证码是否就能万无一失呢,也不尽然。虽然不是所有验证码都能识别(如QQ的变形汉字验证码是不太可能用软件识别的,个人觉得),但还是有很多验证码可以用软件来识别的。

  下面以天涯博客里的评论验证码为例,说明验证码识别的基本思路和方法:


(网页截图)

第一步、获取验证码图片

  C#可以用HttpWebRequest类GET验证码的网址,得到返回的数据流,再将数据流值赋给Bitmap变量。在Winform里放一个PictureBox控件,将它的Image属性指定为Bitmap变量,就可以显示出验证码图片了。
也可以使用Bitmap的Save方法将图片保存成Bmp文件。

    Stream resStream = response.GetResponseStream();//得到验证码数据流
    Bitmap sourcebm = new Bitmap(resStream);//初始化Bitmap图片

在Photoshop中将验证码图片放大1600%,如下:


  
第二步、将验证码图片去色(将彩色转换为灰度)

  去色是为了进一步做成黑白双色图片。

    Color c = sourcebm.GetPixel(x, y);
    int luma = (int)(c.R * 0.3 + c.G * 0.59 + c.B * 0.11);//转换灰度的算法
    sourcebm.SetPixel(x, y, Color.FromArgb(luma, luma, luma));


  第三步、去杂色,转换为黑白图片

  从灰度图片中可以看出,数字的颜色比较深,而杂色都是比较浅,所以可以设定一个临界颜色值,颜色高于或等于这个值的设置为白色,低于这个值的设置为黑色。

    Color c = sourcebm.GetPixel(x, y);
    if (c.R >= critical_value)
        sourcebm.SetPixel(x, y, Color.FromArgb(255, 255, 255));
    else
        sourcebm.SetPixel(x, y, Color.FromArgb(0, 0, 0));


  第四步、动态得到每个数字的边界
 

for (int x = 0; x < sourcebm.Width; x++)
{
    myColumn = true;
    for (int y = 0; y < sourcebm.Height; y++)
    {
        Color c = sourcebm.GetPixel(x, y);
        if (c.R == 0 && charStart == false)//第一次出现黑点
        {
            widthStartX[charNum] = x;
            charStart = true;
            break;
        }
        if (c.R == 0 && charStart == true)//后续出现黑点
        {
            myColumn = false;
            break;
        }
    }
    if (myColumn == true && charStart == true && widthStartX[charNum] < x)//如果当列没有黑点并且前面出现过黑点还没结束
    {
        widthEndX[charNum] = x - 1;
        charStart = false;
        charNum++;
    }
    if (charStart == true && myColumn == false && x == (bmp.Width - 1))//如果开始出现黑点了,并且最后一列也有黑点
    {
        widthEndX[charNum] = x;
        charStart = false;
        charNum++;
    }
}

 五、得到每个字符的特征码

  在每个字符的边界内,检测每个象素,如果象素为白色则为"0",如果象素为黑色则为"1",将"0""1"连起来就是该数字或字符的特征码。

    Color c = sourcebm.GetPixel(x, y);
    if (c.R == 0)
        str = str + "1";
    else
        str = str + "0";

  
六、完成验证码图片的识别

  将获取的特征码和对应的数字或字符保存起来,下次再将新获取的特征码跟保存的特征码对比,如果相同则提取对应的数字或字符,完成验证码的识别。

  • 上一篇:

  • 下一篇:
  • 【字体: 】【打印此文】【关闭窗口
      相关文章:(只显示最新16条)
    C#随机生成中文汉字验证码的基本原理
    .Net程序处理汉字编码原理分析
    ASP.Net实现阿拉伯数字与英文字符混合的验证码
    .Net图片验证码安全-及时销毁你的验证码
    C#实现网站用户自动登录的方法
    ASP.Net图形验证码(C#源码)
    Asp.net动态生成验证码的实现方法
    C#识别网站图片验证码的方法

    | 设为首页 | 加入收藏 | 联系站长 | | 友情链接 | 版权申明 |
    乐博网欢迎各种媒体转载我们的原创作品[转载请注明出处];我们鼓励更多VB.Net开发者一起加入研究与探讨;如发现文章访问错误、内容错误或版权疑问、内容有违相关法律(如涉及政治、色情、反动或散布虚假有害信息)等情况,请及时向我们举报,我们将及时纠正!
    联系邮箱:Shiny#vip.qq.com (#替换为@) QQ交流群: 40797788 [闽ICP备05014267号]