QQ验证码识别源代码(C#/NET1.1)

notsamenum++;
}
}
if(notsamenum<4)
{
char cj=(char)datachar[ii];
return cj.ToString();
}
}
return jieguo;
}
///

1<summary>   
2/// 检查特征库中是否已经存在相关记录   
3/// </summary>

bool ischardatain()
{
bool jieguo=false;
for(int ii=0;ii

  1<datanum;ii++) if(system.math.abs(dataxy[ii,0]-xlpic)="" int="" notsamenum="0;" {="" 如果能够收集更多的特征库,识别率可以达到80%以上="" 当然也可以改进品配算法(如使用关键点品配),以用较少的特征库达到较高的识别率,但="" 统计一共有多少行的像素有差异,如果在4行以内就认为是存在该记录="" 这种方法比较原始,但比较适合多线程时的运行,因为程序只进行简单的逻辑比较="" 那样有比较大的机会造成识别错误并且多线程时占用较多cpu时间。="" (此时可能需要将特征库的容量提高到15w个或以上)="">1 || System.Math.Abs(dataxy[ii,1]-ylpic)&gt;1)   
  2{   
  3continue;   
  4}   
  5for(int jj=0;jj&lt;20;jj++)   
  6{   
  7if(datap[ii,jj]!=datapic[jj])   
  8{   
  9notsamenum++;   
 10}   
 11}   
 12if(notsamenum&lt;4)   
 13{   
 14string asdasd=((char)datachar[ii]).ToString();   
 15return true;   
 16}   
 17}   
 18return jieguo;   
 19}   
 20/// <summary>   
 21/// 添加到特征库中,并暂时将对应的字符置为空格以待人工识别   
 22/// </summary>   
 23void adddatawithnullchar()   
 24{   
 25if(this.ischardatain())   
 26{   
 27return;   
 28}   
 29for(int ii=0;ii&lt;20;ii++)   
 30{   
 31datap[datanum,ii]=this.datapic[ii];   
 32}   
 33//暂时将对应的字符置为空格以待人工识别   
 34datachar[datanum]=32;   
 35dataxy[datanum,0]=this.xlpic;   
 36dataxy[datanum,1]=this.ylpic;   
 37datanum++;   
 38}   
 39/// <summary>   
 40/// 检查验证码图片是否能分成4个部分,如果可以就检查4个字符在特征库中是否已经存在,如果不存在,   
 41/// 就添加到特征库中,并暂时将对应的字符置为空格以待人工识别   
 42/// </summary>   
 43public void writetodata()   
 44{   
 45bool[,] picpixel=new bool[49,20];   
 46for(int ii=0;ii&lt;49;ii++)   
 47{   
 48for(int jj=0;jj&lt;20;jj++)   
 49{   
 50if(bp.GetPixel(ii,jj).GetBrightness()&lt;0.999)   
 51{   
 52picpixel[ii,jj]=true;   
 53}   
 54}   
 55}   
 56int[] index=new int[8];   
 57int indexnum=0;   
 58bool black=false;   
 59for(int ii=0;ii&lt;49;ii++)   
 60{   
 61bool haveblack=false;   
 62for(int jj=0;jj&lt;20;jj++)   
 63{   
 64if(picpixel[ii,jj])   
 65{   
 66haveblack=true;   
 67break;   
 68}   
 69}   
 70if(haveblack &amp;&amp; black==false)   
 71{   
 72index[indexnum]=ii;   
 73indexnum++;   
 74black=true;   
 75}   
 76if(!haveblack &amp;&amp; black)   
 77{   
 78index[indexnum]=ii;   
 79indexnum++;   
 80black=false;   
 81}   
 82}   
 83if(indexnum&lt;7)   
 84{   
 85return;   
 86}   
 87if(indexnum==7)   
 88{   
 89index[7]=49;   
 90}   
 91//****   
 92for(int ii=0;ii&lt;4;ii++)   
 93{   
 94int x1=index[ii*2];   
 95int x2=index[ii*2+1];   
 96int y1=0,y2=19;   
 97bool mb=false;   
 98for(int jj=0;jj&lt;20;jj++)   
 99{   
100for(int kk=x1;kk<x2;kk++) break;="" for(int="" if(mb)="" if(picpixel[kk,jj])="" jj="19;jj" mb="false;" y1="jj;" {="" }="">=0;jj--)   
101{   
102for(int kk=x1;kk<x2;kk++) **以上是获取有效区域的范围="" break;="" for(int="" if(mb)="" if(picpixel[kk,jj])="" if(xlpic="" jj="0;jj&lt;20;jj++)" mb="true;" this.datapic[jj]="0;" this.xlpic="(byte)(x2-x1);" y2="jj;" {="" }="" 如果字符宽度超过16个像素就不予处理="">16)   
103{   
104continue;   
105}   
106this.ylpic=(byte)(y2-y1+1);   
107int ys=-1;   
108ushort[] addin=new ushort[]{1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768};   
109for(int jj=y1;jj&lt;=y2;jj++)   
110{   
111ys++;   
112int xs=-1;   
113for(int kk=x1;kk<x2;kk++) ****="" <summary="" if(picpixel[kk,jj])="" this.adddatawithnullchar();="" this.datapic[ys]="(ushort)(this.datapic[ys]+addin[xs]);" xs++;="" {="" }="">   
114/// 识别图片   
115///    
116/// <returns>返回识别结果(如果返回的字符串长度小于4就说明识别失败)</returns>   
117public string ocrpic()   
118{   
119string jieguo="";   
120bool[,] picpixel=new bool[49,20];   
121for(int ii=0;ii&lt;49;ii++)   
122{   
123for(int jj=0;jj&lt;20;jj++)   
124{   
125if(bp.GetPixel(ii,jj).GetBrightness()&lt;0.999)   
126{   
127picpixel[ii,jj]=true;   
128}   
129}   
130}   
131int[] index=new int[8];   
132int indexnum=0;   
133bool black=false;   
134for(int ii=0;ii&lt;49;ii++)   
135{   
136bool haveblack=false;   
137for(int jj=0;jj&lt;20;jj++)   
138{   
139if(picpixel[ii,jj])   
140{   
141haveblack=true;   
142break;   
143}   
144}   
145if(haveblack &amp;&amp; black==false)   
146{   
147index[indexnum]=ii;   
148indexnum++;   
149black=true;   
150}   
151if(!haveblack &amp;&amp; black)   
152{   
153index[indexnum]=ii;   
154indexnum++;   
155black=false;   
156}   
157}   
158if(indexnum&lt;7)   
159{   
160return jieguo;   
161}   
162if(indexnum==7)   
163{   
164index[7]=49;   
165}   
166//****   
167for(int ii=0;ii&lt;4;ii++)   
168{   
169int x1=index[ii*2];   
170int x2=index[ii*2+1];   
171int y1=0,y2=19;   
172bool mb=false;   
173for(int jj=0;jj&lt;20;jj++)   
174{   
175for(int kk=x1;kk<x2;kk++) break;="" for(int="" if(mb)="" if(picpixel[kk,jj])="" jj="19;jj" mb="false;" y1="jj;" {="" }="">=0;jj--)   
176{   
177for(int kk=x1;kk<x2;kk++) **以上是获取有效区域的范围="" break;="" for(int="" if(mb)="" if(picpixel[kk,jj])="" if(xlpic="" jj="0;jj&lt;20;jj++)" mb="true;" this.datapic[jj]="0;" this.xlpic="(byte)(x2-x1);" y2="jj;" {="" }="" 如果字符宽度超过16个像素就不予处理="">16)   
178{   
179continue;   
180}   
181this.ylpic=(byte)(y2-y1+1);   
182int ys=-1;   
183ushort[] addin=new ushort[]{1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768};   
184for(int jj=y1;jj&lt;=y2;jj++)   
185{   
186ys++;   
187int xs=-1;   
188for(int kk=x1;kk&lt;x2;kk++)   
189{   
190xs++;   
191if(picpixel[kk,jj])   
192{   
193this.datapic[ys]=(ushort)(this.datapic[ys]+addin[xs]);   
194}   
195}   
196}   
197jieguo=jieguo+this.getchar();   
198}   
199return jieguo;   
200}   
201}   
202}</x2;kk++)></x2;kk++)></x2;kk++)></x2;kk++)></x2;kk++)></datanum;ii++)>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus