-
-
[原创]某游戏图形验证码的识别技术,含源代码.(原理简单适合初级)
-
发表于:
2014-3-31 21:24
12529
-
[原创]某游戏图形验证码的识别技术,含源代码.(原理简单适合初级)
//大至思路
{
//找出直线的起点,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直播授课