|

- 帖子
- 159
- 威望
- 33
- 金钱
- 104
- 贡献
- 4
|
1行
发表于 2009-2-16 23:16
| 只看该作者
[网络相关] 远景论坛 验证码识别 【已更新并附上 编写心得 】
有一天突发奇想做了起来~
历时三天半,摸黑碰了不少壁
目前识别率为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 编辑 ]
|
-
1
评分次数
-
|