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)>1)
2{
3continue;
4}
5for(int jj=0;jj<20;jj++)
6{
7if(datap[ii,jj]!=datapic[jj])
8{
9notsamenum++;
10}
11}
12if(notsamenum<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<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<49;ii++)
47{
48for(int jj=0;jj<20;jj++)
49{
50if(bp.GetPixel(ii,jj).GetBrightness()<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<49;ii++)
60{
61bool haveblack=false;
62for(int jj=0;jj<20;jj++)
63{
64if(picpixel[ii,jj])
65{
66haveblack=true;
67break;
68}
69}
70if(haveblack && black==false)
71{
72index[indexnum]=ii;
73indexnum++;
74black=true;
75}
76if(!haveblack && black)
77{
78index[indexnum]=ii;
79indexnum++;
80black=false;
81}
82}
83if(indexnum<7)
84{
85return;
86}
87if(indexnum==7)
88{
89index[7]=49;
90}
91//****
92for(int ii=0;ii<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<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<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<=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<49;ii++)
122{
123for(int jj=0;jj<20;jj++)
124{
125if(bp.GetPixel(ii,jj).GetBrightness()<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<49;ii++)
135{
136bool haveblack=false;
137for(int jj=0;jj<20;jj++)
138{
139if(picpixel[ii,jj])
140{
141haveblack=true;
142break;
143}
144}
145if(haveblack && black==false)
146{
147index[indexnum]=ii;
148indexnum++;
149black=true;
150}
151if(!haveblack && black)
152{
153index[indexnum]=ii;
154indexnum++;
155black=false;
156}
157}
158if(indexnum<7)
159{
160return jieguo;
161}
162if(indexnum==7)
163{
164index[7]=49;
165}
166//****
167for(int ii=0;ii<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<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<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<=y2;jj++)
185{
186ys++;
187int xs=-1;
188for(int kk=x1;kk<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++)>