首页
社区
课程
招聘
[原创]某游戏图形验证码的识别技术,含源代码.(原理简单适合初级)
发表于: 2014-3-31 21:24 12350

[原创]某游戏图形验证码的识别技术,含源代码.(原理简单适合初级)

2014-3-31 21:24
12350


此源代码中借用了, <<Visual+C++数字图像处理-谢凤英-源代码>>第一章的读取BMP图片,及保存BMP图片的一些代码.以下为图形识别思路.其中肯定有许多不足之处,请大家帮俺指出来,嘻嘻.

//大至思路
     {
         //找出直线的起点,1
         {
              //分析后发现点的周围只有一个白点时就是直线的一个端点.
              //周围只一个白点很好找.以当前点为中心直接扫描一个正方形就行了.
                       for(int x=-1;x<2;x++)
                       {
                            for(int y=-1;y<2;y++)
                            {

              //通过累加这九个点中的白点,如果只有两个(为什么两个,是因为包含了自己)白点就认为是一个线条的起点
              if(WPointNumber==2)
         };

         //确定起点的延伸方向,2
         {
              //首先根据起点确定直线的上下左右的大方向.
              //找出大方向后,只向此方向取三点再判断(优先取垂直线)
              方向的话总共八个,我采用的查表法,直接把方向查询出来.
              然后再顺着方向扫描三个点.大至有以下几种,我也写固定了.

              2 3        1 2       原点1   1 原点
              1 原点   原点 3         3 2   2 3

              1           1     1  2  3
              2 原点   原点2       原点        原点
              3           3                 3  2  1

            switch(direction)
              {
                   case 0:
                       tempPoint2[0][0] = tEndP[tempCheck].X - 1; tempPoint2[0][1] = tEndP[tempCheck].Y + 1;
                       tempPoint2[1][0] = tEndP[tempCheck].X; tempPoint2[1][1] = tEndP[tempCheck].Y + 1;
                       tempPoint2[2][0] = tEndP[tempCheck].X + 1; tempPoint2[2][1] = tEndP[tempCheck].Y + 1;
                       break;
         };
         //找出直线终点,3
         {
              //如果找到两点以上新的白点时,说明已经与别的东西相交了,此时停止扫描
              else if(WPointNumber == 0 || WPointNumber == 3)
              {
                   break;
              }
          };
         //计算出各线条的垂直角度,4
         {
              //起点X 减 终点X ,起点Y 减 终点Y得出两条直角边的长度,然后利用atan函数计算出角度
              double Direction = atan2((double)abs(line[i].EndP.X - line[i].BeginP.X),(double)abs(line[i].EndP.Y - line[i].BeginP.Y)) * 180/3.1415926; 
         };
         //筛选出适当角度的线条,5
         {
              //经过分析后发现角度特别小或特别大的将不属于箭头方向的线条.
              //经过大量测试这个角度范围为 25 ~ 65 度之间.
              if(Direction > 25 && Direction < 65)
         };
         //计算出箭头的整个方向,6
         {
              //根据筛选出线条的延伸方向(查表得出).以及根据他们的几种组合,得出最终结果.
              //线条的延伸方向 相加后结果分别为 //左9//右13//下12//上10
              总共有四种方向是有效的,其它四种为垂直方向,暂不用于判断.
              然后相加得出一个数,而且是唯一的,哈哈,那就直接拿来做方向咯.
              {4,5},//左9 
              {6,7},//右13
              {5,7},//下12
              {4,6},//上10

             if(Ddirection == 9)printf("左\n");
             else if(Ddirection == 10)printf("上\n");
             else if(Ddirection == 12)printf("下\n");
             else if(Ddirection == 13)printf("右\n");
         };
     };




其中还有些许细节未作解释了,详情请看源代码.

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 5
支持
分享
最新回复 (20)
雪    币: 11
活跃值: (32)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
哎呦,怎么都没人提意见呢...
2014-4-8 09:20
0
雪    币: 0
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
赞一个!
2014-4-12 20:30
0
雪    币: 143
活跃值: (263)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
4
厉害  赞一个!
2014-4-12 20:36
0
雪    币: 186
活跃值: (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
赞一个          赞一个
2014-4-12 23:54
0
雪    币: 11
活跃值: (32)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
哎呦,游戏居然把图片的线,给加粗了,哈哈.
2014-4-21 13:19
0
雪    币: 19
活跃值: (74)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
不错,应该给予转正!
2014-4-22 11:14
0
雪    币: 1
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
这个我也做过,其实很简单就能识别,直接利用“头重脚轻”的原理,首先判断是上下还是左右结构,然后取等分线,区别白色点的数目,对于这个游戏的验证识别码识别率高达95%
2014-4-27 15:16
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
如果这个图的随机性很大怎么办?
2014-4-27 15:32
0
雪    币: 294
活跃值: (119)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
10
3次机会。。。4个选择。。。我感觉还不如蒙3次- -目测人品好就妥妥的~咩哈哈哈
2014-4-27 15:38
0
雪    币: 2559
活跃值: (176)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
11
不错,应该给予转正!
2014-5-3 09:22
0
雪    币: 341
活跃值: (138)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
12
竟然还没给人家转正!?。。。
2014-5-3 10:02
0
雪    币: 153
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
因为被你泄露了,哈哈
2014-5-5 23:16
0
雪    币: 6
活跃值: (1099)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
不错,先学习
2014-5-5 23:33
0
雪    币: 77
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
mark
2014-5-6 09:29
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
mark
2014-5-8 14:30
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
学习了。
2014-5-8 15:54
0
雪    币: 11
活跃值: (32)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
18
其实里面还是有许多变态的形状.经过好几次算法变更.这种没加粗的能达到80%.还没达到90%,这游戏居然把算法给改了,加了个阴影.好变态哦.后来就一直想不出什么好的识别算法了.似乎头重脚轻,感觉有给我那么点灵感了.这个纯属研究.绝对没有拿来商业化.
2014-5-13 17:36
0
雪    币: 3496
活跃值: (749)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
赞!!!
2014-7-1 07:54
0
雪    币: 64
活跃值: (97)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
谢谢 大牛分享 
2018-6-27 09:57
0
雪    币: 216
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
谢谢楼主分享
2018-6-30 20:50
0
游客
登录 | 注册 方可回帖
返回
//