欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

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

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


此源代码中借用了, <<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");
         };
     };


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

上传的附件 QQ图片20140305211749.jpg
QQ图片20140305211755.jpg
chap1-1.rar
QQ截图20140331212117.png
QQ截图20140331212226.png

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功