文章地址:http://blog.csdn.net/u011535382/article/details/48210643

本文是成都地区CMCC-EDU登陆时候的验证码识别过程分析,完整的登陆过程分析在 这里。

1.验证码识别难度分析

经过对比观察发现,CMCC-EUD的验证码其实很二的,其中每个数字的出现位置是固定的,每个数字每次出现的形状也是一样的,只有少量的噪点可以通过分区和二值化处理来消除。

可以将图片看成是44*20的一个矩阵,只要能够把它每个数字标准的形式存储下来,再将整个验证码分为四个区域,逐一比较,找出差异度最小的就实现了。

2.标准数字矩阵的建立

由于每个数字可以看成是 13*9 的矩阵,需要将他们转化为二值并储存在二维数组中作为每次比较的标准。先通过ps将图片裁剪成 13*9 分辨率的文件,再由软件对比识别。

这是二值化前的效果:

其中彩色转化为灰度的计算方式为 gray = R*0.11+G *0.59 + B*0.3;灰度转二值的阀值取为 128,这样实际的的效果最好。再将识别出来的图像矩阵存储到文本文件 stand.txt 中方便以后编程的使用。

二值化后的效果:

4.验证码的识别思路

1、将待验证的图片分为四个区域;

2、选择一个区域数字识别;

3、将10个标准数字矩阵和待识别区做异或操作,统计差异最小的那个数就是识别出来的数num;

4、若四个区域都识别完,返回识别结果,若没有,转到步骤2。

5.具体实现代码

/*
验证码识别函数
参数: 包含验证码图片的 CImage 对象
返回值: 识别结果的 CString */
CString Distinguish(CImage &image)
{CString strResult;//每张验证码分为四个区域for(int temp= 0; temp<=3; temp++){bool pixelArray[13][9] = {0};int numL = 11*temp+2;   //x像素坐标的左边起点int numR = numL + 9;  //x像素坐标的右边起点int resultNum = 0;//对一个图像进行扫描二值化 存储在  pixelArrayfor (int y=2; y<15; y++){for (int x=numL; x<numR; x++){COLORREF colorRef = image.GetPixel(x,y);//RGB同时扩大100倍  转化为灰度值int gray = GetRValue(colorRef)*11+GetGValue(colorRef)*59+GetBValue(colorRef)*30;if (gray>=12800){pixelArray[y-2][x-numL] = true;}else{pixelArray[y-2][x-numL] = false;}}}//对一个区域的数字进行识别//将10个标准数字与目标数字矩阵比较int mincount = 117;for (int num =0; num<10; num++){int count = 0;for (int y=0; y<13; y++){for (int x=0; x<9 ;x++){//统计差异的个数if (standNum[num][y][x]&&pixelArray[y][x]){count++;}}}if (count<mincount){mincount = count;resultNum = num;}}//将识别出来的数字转化为CStringCString strFormat;strFormat.Format("%d", resultNum);strResult += strFormat;}return strResult;
}

6.验证码识别效果

经过300多张图片的测试,成功率为 100% (主要是图片太简单)。

CMCC-EDU 模拟登陆中的验证码识别相关推荐

  1. java使用Selenium模拟登陆58(验证码登陆密码登陆)若快平台识别文字点击验证码

    文章目录 写在前面 配置环境 Selenium入门 使用Selenium登陆58 若快平台识别文字点击验证码 附: By对象中的 xpath & cssSelector获取方式** 不打开浏览 ...

  2. python中selenium(模拟登陆)+pytesseract(自动识别验证码)应用例子之查询住房公积金

    这里以查询深圳住房公积金为例(http://gjj.sz.gov.cn/fzgn/zfcq/) from selenium import webdriver # 模拟浏览器操作 from PIL im ...

  3. 模拟登陆 - 破解12306验证码

    12306模拟登陆demo: 用selenium来进行模拟登陆操作,主要是这个验证码部分. https://kyfw.12306.cn/otn/resources/login.html 这个验证码解决 ...

  4. 以豆瓣网为例,模拟登陆爬虫以及验证码处理

    在利用scrapy框架爬各种网站时,一定会碰到某些网站是需要登录才能获取信息. 最近在学天善智能课堂韦玮老师的课程,python数据挖掘与分析实战 ,通过自己部分的代码和借鉴老师的项目,多次试验改进调 ...

  5. python爬虫爬网站数据登录_使用webdriver+urllib爬取网页数据(模拟登陆,过验证码)...

    urilib是python的标准库,当我们使用Python爬取网页数据时,往往用的是urllib模块,通过调用urllib模块的urlopen(url)方法返回网页对象,并使用read()方法获得ur ...

  6. 使用webdriver+urllib爬取网页数据(模拟登陆,过验证码)

    urilib是python的标准库,当我们使用Python爬取网页数据时,往往用的是urllib模块,通过调用urllib模块的urlopen(url)方法返回网页对象,并使用read()方法获得ur ...

  7. python重定向cookie_模拟登陆中 302 重定向和 cookies 的一些困惑

    我想写一个查询话费和流量的爬虫,关键是实现模拟登陆的这个部分. 在登陆过程中,点击登陆之后,登陆表单会 post 到一个地址(这一步浏览器不显示),然后会 302 跳转到登陆成功的页面. 我现在想得到 ...

  8. 网络爬虫中的验证码识别

    网络爬虫遇到的验证码 在写网络,爬虫时,遇到很多网站存在验证码的情形,有其是比较烦的是,爬取数据的每一页都有验证码,如果只有登陆时,存在验证码,这个很好解决,只需将验证码获取后手动输入就行. 但对于每 ...

  9. selenium模拟登陆时截取验证码

    模拟登陆时,经常会遇到有验证码的问题,那么就需要把验证码给截取下来. 如下为截取验证码程序,该程序的原始地址为:http://www.cnblogs.com/donaldlee2008/p/53045 ...

最新文章

  1. 开源项目event-stream被注入恶意代码,盗取区块链钱包助记词
  2. Cpp拾零(to be continued)
  3. Mac系统的终端显示git当前分支
  4. 中央暗示:07年别急买房
  5. 用python绘制图形_python绘制图形
  6. AmazeUI基本样式
  7. 服务器性能指标(一)——负载(Load)分析及问题排查
  8. WGCNA分析,简单全面的最新教程(在线做,但也需要懂原理)
  9. oracle 压力测试工具benchmarksql
  10. Nginx 配置实现web解析php代码 过程记录
  11. matlab编辑rayfile光源文件,rayfile网盘功能详解 rayfile网盘安装步骤及安装注意事项...
  12. lol新加坡服务器怎么修复,英雄联盟差点被新加坡服翻译“毁了”,7张图片看到想要吐血...
  13. C#:获取Web.config中数据库连接地址
  14. 一个简单的js作用域题目(原创)
  15. 栈和队列常用函数详解
  16. 计算机word英语词汇大全,计算机专业英语词汇缩写大全
  17. VSTOOutlook发邮件时To中和中按照名字首字母排序
  18. IMU标定——椭球拟合
  19. HTML DOM 导航
  20. 软件测试基础篇(1)

热门文章

  1. Linux嵌入式开发常见面试题
  2. 读书记录|《2001 太空漫游》
  3. 笑话大全 API数据接口
  4. Active Directory 01 - “史上最全”测试环境搭建模板
  5. vi/vim 使用解说
  6. php 代替 echo 方法, 或者php的 替换语法使用方法.
  7. WHU-关于Scanf_s 返回值的Hint
  8. JAVA SE/EE/ME区别
  9. 表的设计和创建、视图和索引以及事务
  10. mysql key reads 参数_MySQL参数性能优化