自动识别验证码的解决方案

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

第一步、获取验证码图片
C#可以用HttpWebRequest类GET验证码的网址,得到返回的数据流,再将数据流值赋给Bitmap变量。在Winform里放一个PictureBox控件,将它的Image属性指定为Bitmap变量,就可以显示出验证码图片了。
也可以使用Bitmap的Save方法将图片保存成Bmp文件。
  Stream resStream = response.GetResponseStream();//得到验证码数据流
  Bitmap sourcebm = new Bitmap(resStream);//初始化Bitmap图片

 

第二步、将验证码图片去色(将彩色转换为灰度)
去色是为了进一步做成黑白双色图片。
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";
}


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值