首页
·
新闻
·
数码
·
硬件
·
摄友
·
产品
·
网络
·
术语
·
技巧
·
下载
·
卖场
·
答疑
·
笑话
·
读编
·
RSS
·
博客
·
论坛
·
繁體版
频道首页
·
硬碰硬
·
黑客攻防
·
站长之家
·
网络学堂
·
网络技巧
·
小怪诊所
·
术语
·
下载
·
论坛
网络新品
导购
黑客入门
黑客教程
攻防实战
QQ攻防
黑客编程
黑人黑事
网络编程
网页陶吧
数据库
网站架设
网站推广
升知堂
宽带
无线
LAN
ASP
PHP
JSP
.NET
XML
CGI
Java
HTML/CSS
Dreamweaver
Frontpage
Access
MSSQL
MySQL
DB2
Oracle
Sybase
您现在的位置:
走进数码网
>>
网络时空
>>
站长之家
>>
网络编程
>>
.NET专区
>> 网络正文
QQ验证码识别源代码(C#/NET1.1)
发表日期
:2005-5-18
来源
:中国站长学院
作者
:佚名
阅读
:次
收藏至
:
新浪ViVi
|
天天网摘
|
人人网摘
|
加加文摘
|
YouNote书签
|
我摘网摘
|
博采中心
|
和讯网摘
notsamenum++;
}
}
if(notsamenum<4)
{
char cj=(char)datachar[ii];
return cj.ToString();
}
}
return jieguo;
}
/// <summary>
/// 检查特征库中是否已经存在相关记录
/// </summary>
bool ischardatain()
{
bool jieguo=false;
for(int ii=0;ii<datanum;ii++)
{
//统计一共有多少行的像素有差异,如果在4行以内就认为是存在该记录
//这种方法比较原始,但比较适合多线程时的运行,因为程序只进行简单的逻辑比较
//如果能够收集更多的特征库,识别率可以达到80%以上
//(此时可能需要将特征库的容量提高到15W个或以上)
//当然也可以改进品配算法(如使用关键点品配),以用较少的特征库达到较高的识别率,但
//那样有比较大的机会造成识别错误并且多线程时占用较多
CPU
时间。
int notsamenum=0;
if(System.Math.Abs(dataxy[ii,0]-xlpic)>1 || System.Math.Abs(dataxy[ii,1]-ylpic)>1)
{
continue;
}
for(int jj=0;jj<20;jj++)
{
if(datap[ii,jj]!=datapic[jj])
{
notsamenum++;
}
}
if(notsamenum<4)
{
string asdasd=((char)datachar[ii]).ToString();
return true;
}
}
return jieguo;
}
/// <summary>
/// 添加到特征库中,并暂时将对应的字符置为空格以待人工识别
/// </summary>
void adddatawithnullchar()
{
if(this.ischardatain())
{
return;
}
for(int ii=0;ii<20;ii++)
{
datap[datanum,ii]=this.datapic[ii];
}
//暂时将对应的字符置为空格以待人工识别
datachar[datanum]=32;
dataxy[datanum,0]=this.xlpic;
dataxy[datanum,1]=this.ylpic;
datanum++;
}
/// <summary>
/// 检查验证码图片是否能分成4个部分,如果可以就检查4个字符在特征库中是否已经存在,如果不存在,
/// 就添加到特征库中,并暂时将对应的字符置为空格以待人工识别
/// </summary>
public void writetodata()
{
bool[,] picpixel=new bool[49,20];
for(int ii=0;ii<49;ii++)
{
for(int jj=0;jj<20;jj++)
{
if(bp.GetPixel(ii,jj).GetBrightness()<0.999)
{
picpixel[ii,jj]=true;
}
}
}
int[] index=new int[8];
int indexnum=0;
bool black=false;
for(int ii=0;ii<49;ii++)
{
bool haveblack=false;
for(int jj=0;jj<20;jj++)
{
if(picpixel[ii,jj])
{
haveblack=true;
break;
}
}
if(haveblack && black==false)
{
index[indexnum]=ii;
indexnum++;
black=true;
}
if(!haveblack && black)
{
index[indexnum]=ii;
indexnum++;
black=false;
}
}
if(indexnum<7)
{
return;
}
if(indexnum==7)
{
index[7]=49;
}
//****
for(int ii=0;ii<4;ii++)
{
int x1=index[ii*2];
int x2=index[ii*2+1];
int y1=0,y2=19;
bool mb=false;
for(int jj=0;jj<20;jj++)
{
for(int kk=x1;kk<x2;kk++)
{
if(picpixel[kk,jj])
{
mb=true;
break;
}
}
if(mb)
{
y1=jj;
break;
}
}
mb=false;
for(int jj=19;jj>=0;jj--)
{
for(int kk=x1;kk<x2;kk++)
{
if(picpixel[kk,jj])
{
mb=true;
break;
}
}
if(mb)
{
y2=jj;
break;
}
}
//**以上是获取有效区域的范围
for(int jj=0;jj<20;jj++)
{
this.datapic[jj]=0;
this.datapic[jj]=0;
}
this.xlpic=(byte)(x2-x1);
//如果字符宽度超过16个像素就不予处理
if(xlpic>16)
{
continue;
}
this.ylpic=(byte)(y2-y1+1);
int ys=-1;
ushort[] addin=new ushort[]{1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768};
for(int jj=y1;jj<=y2;jj++)
{
ys++;
int xs=-1;
for(int kk=x1;kk<x2;kk++)
{
xs++;
if(picpixel[kk,jj])
{
this.datapic[ys]=(ushort)(this.datapic[ys]+addin[xs]);
}
}
}
this.adddatawithnullchar();
}
//****
}
/// <summary>
/// 识别图片
/// </summary>
/// <returns>返回识别结果(如果返回的字符串长度小于4就说明识别失败)</returns>
public string ocrpic()
{
string jieguo="";
bool[,] picpixel=new bool[49,20];
for(int ii=0;ii<49;ii++)
{
for(int jj=0;jj<20;jj++)
{
if(bp.GetPixel(ii,jj).GetBrightness()<0.999)
{
picpixel[ii,jj]=true;
}
}
}
int[] index=new int[8];
int indexnum=0;
bool black=false;
for(int ii=0;ii<49;ii++)
{
bool haveblack=false;
for(int jj=0;jj<20;jj++)
{
if(picpixel[ii,jj])
{
haveblack=true;
break;
}
}
if(haveblack && black==false)
{
index[indexnum]=ii;
indexnum++;
black=true;
}
if(!haveblack && black)
{
index[indexnum]=ii;
indexnum++;
black=false;
}
}
if(indexnum<7)
{
return jieguo;
}
if(indexnum==7)
{
index[7]=49;
}
//****
for(int ii=0;ii<4;ii++)
{
int x1=index[ii*2];
int x2=index[ii*2+1];
int y1=0,y2=19;
bool mb=false;
for(int jj=0;jj<20;jj++)
{
for(int kk=x1;kk<x2;kk++)
{
if(picpixel[kk,jj])
{
mb=true;
break;
}
}
if(mb)
{
y1=jj;
break;
}
}
mb=false;
for(int jj=19;jj>=0;jj--)
{
for(int kk=x1;kk<x2;kk++)
{
if(picpixel[kk,jj])
{
mb=true;
break;
}
}
if(mb)
{
y2=jj;
break;
}
}
//**以上是获取有效区域的范围
for(int jj=0;jj<20;jj++)
{
this.datapic[jj]=0;
this.datapic[jj]=0;
}
this.xlpic=(byte)(x2-x1);
//如果字符宽度超过16个像素就不予处理
if(xlpic>16)
{
continue;
}
this.ylpic=(byte)(y2-y1+1);
int ys=-1;
ushort[] addin=new ushort[]{1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768};
for(int jj=y1;jj<=y2;jj++)
{
ys++;
int xs=-1;
for(int kk=x1;kk<x2;kk++)
{
xs++;
if(picpixel[kk,jj])
{
this.datapic[ys]=(ushort)(this.datapic[ys]+addin[xs]);
}
}
}
jieguo=jieguo+this.getchar();
}
return jieguo;
}
}
}
【责任编辑:怪鸭兽】
【
发表评论
】【
加入收藏
】【
告诉好友
】【
打印此文
】【
关闭窗口
】
发表评论
(评论内容只代表网友观点,与本站立场无关。)
姓名:
*
QQ:
性别:
男
女
MSN:
E-mail:
ICQ:
主页:
评分:
1分
2分
3分
4分
5分
内容:
·请遵守
《互联网电子公告服务管理规定》
、
《全国人大常委会关于维护互联网安全的决定》
及中华人民共和国其他法律法规。
·用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
用户登录
站内搜索
文章资讯
软件下载
摄友部落
i 论 坛
相关文章
窥探MM长相——QQ强行视频之实战
QQ安全指南(续)
QQ回归记
用NTFS权限拒收QQ广告
QQ杀手6.75和6.80版的手动杀除方法
QQ危险密码排行榜
QQ本地验证算法被破译 简单密码可轻易破解
通报QQ群漏洞
全球首个QQ木马 通过QQ即可控制电脑
三大病毒一日五变种邮件和QQ传播途径
图片文章
热点文章
关于我们
|
广告服务
|
投稿指南
|
人才招聘
|
隐私条款
|
会员注册
|
友情链接
|
意见反馈
|
网站地图
Copyright © 2002-2005
走进宠物网
所有文章和图片
版权所有
。
未经授权禁止一切非法转载、摘编、复制或建立镜像,否则将追究其法律责任。
京ICP备05055013号
68互联
提供网络带宽