返回列表 回复 发帖 免费斗地主赢30元充值卡

[网络相关] 远景论坛 验证码识别 【已更新并附上 编写心得 】

相关搜索: 远景, 论坛, 心得, 附上, 编写
有一天突发奇想做了起来~
历时三天半,摸黑碰了不少壁

目前识别率为80%左右

验证码样式如下:

  
  

==================================================

截图:


目前还没有编写GUI界面,脚本还会更新

==================================================

代码:
注意:请务必在使用以前认真进行设置,推荐使用Windows放大镜和Spy结合使用(为了设置验证码图片的起始坐标)


================================================== 以下是一点点编写心得,作为交流

自身水平有限,所以只能说些自己所发现的部分,而且表达能力也比较差,高手们见笑了

一. 首先当然是观察
观察很重要
于是我写了个脚本用来批量收集样本(在接下来的过程中还需要写几个这样的脚本)
现在开始观察:

这是用Windows放大镜放大后的效果
初步观察一些收集的样本后不难发现,这种验证码大致有以下特点:
1.每个字母或者数字都只有一种主色(除了边缘以外,中间的"骨干部分"真的都是只有一种颜色,一点点细微变化都没有,这也是bmp格式的验证码图片给我们带来的有利条件),还有一种阴影色.颜色随机,一般不会同时出现一样颜色的字符
2.字符的位置随机,字符之间的距离不确定
3.没有前景干扰(没有东西挡在数字字母前面),很好,要是碰上前景干扰我还不知道怎么办
4.每组4个字母或数字,字母全部大写
5.仔细观察多个样本后发现,只有两种字体!一种宽一种窄,而且这两种字体的笔画都很粗
6.没有扭曲,没有缩放,也没有旋转(我数学很烂~要旋转起来估计没法弄了)!
7.背景里没有大面积的连续的同色色块
8.验证码的尺寸不变,都是150x50

二. 确定大致的识别方案
我直接说下粗略的,实际在后来的编写过程中走了不少弯路又回来修改方案的
我是这么做的:
1.首先用一个两层的循环,通过PixelGetColor获取整个验证码图片所有像素点上的颜色信息,用于后面的分析,在获取的过程中"留意"连续相同的颜色(这些连续的颜色一般就是字符的颜色)
2.利用之前第一步里确定下来的四种字符颜色来统计每个字符的"像素面积"
3.根据获得的每个字符的"像素面积"进入对应的"相对点判断"(往下看)
这里说的"相对点判断"就是在字符中找点,通过判断字符中的某几个点是否是"字符颜色"来确定字符
我把判断过程写成一个函数,然后写了个脚本,用鼠标取点自动写脚本
4.最后输出字符(如果在判断过程中发现无法判断的字符可以通过模拟鼠标操作来更换验证码图片,然后Reload重新开始识别,但由于种种原因这一步我没写)

三. 确定大致的识别方案后就要开始 "收集数据" 和 统计 了,那些判断过程中需要的数据
我是这么做的:
1.统计会出现的字符(并不是所有的字母和数字都会出现,有些是没有的),通过统计后后发现,总共会出现24个字母或数字,都是两种字体,也就是说接下来要制作48个"字模"

2.用Photoshop的魔棒功能抠出收集的样本中的字符,做成"字模"(要保证收集的字模必须是"经典"的,不要收集特殊情况的,比如顶端或者低端出界或者周围有相同颜色像素的字符),这一步我是编写一个脚本,然后半自动做的

3.统计收集的每个字模的面积(同样是用脚本半自动做的),并且整理数据,过程中注意核对,防止出错,另外还要注意面积接近的字符,在这里我把面积接近的字符用同种颜色表示在第三列(C列)


四. 最后就是具体的编写过程了,详见帖子中的脚本


==================================================================================
如果有说的不清楚的地方欢迎询问,也欢迎大家提出自己不同的见解~东西写的不好还请见谅







[ 本帖最后由 lskxt 于 2009-2-22 16:04 编辑 ]
附件: 你需要登录才可以下载或查看附件。 QQ登录  免费斗地主赢30元充值卡
1

评分次数

  • BLooM2

哈哈 不错,期待楼主分析一下识别的原理!
大清早来顶了   楼主真热心
呵呵。。。很好很强大。。。
太厉害了!不知道什么原理。
哈哈我群里的大仙 BLooM2有机会进来指点一下
15155327
没有值得不值得,只有愿意不愿意
也是不知道原理,不过功能很强大。、
下载试验了一下,很好,很强大!期待更新
看来以后验证码还是用中文的安全了... :lol
深夜翻译党
- - 不行啊 希望LZ 功能再完善下。。。D
原帖由 sotoba 于 2009-2-18 11:54 发表
- - 不行啊 希望LZ 功能再完善下。。。D
请问是具体是怎样不行? 已经按照帖子和脚本里的说明做了吗?
如果确实不行劳驾能否告知哪出问题了,我说的是比如没反应还是提示哪里出错?
虽然不知道怎么去深入研究,但是还要顶一个
楼主的分析很详细。及其有借鉴意义的思路。

看上去简单,其实花的功夫不少。。。。
原帖由 jfxwc 于 2009-2-18 19:21 发表
楼主的分析很详细。及其有借鉴意义的思路。

看上去简单,其实花的功夫不少。。。。
同意,,單單是收集數據就已經看出樓主是一位有科學家探索精神的人了。。。。。

理論加實際,,我喜歡。。。加油吧。。。
- - 想起来以前我也尝试过 类似的东西
不过不是 识别字体 。。我是想识别游戏屏幕的
PixelGetColor这命令范围一大 太痛苦了
我只能说你太强了,最重要的是逻辑非常清晰
游否就是游否啊!牛。
顶喽
认真阅读LZ的大作。还是没看懂。特意下载学习。
恩,lz弓虽人,居然ahk也能识别。。。我是调用pytesser_v0.0.1模块来识别的,python的识别率还是高点,毕竟PIL库已经很成熟了
返回列表