fs.Read(buff,0,4); allnum=getintfrombyte(buff); byte[] buff0=new byte[2]; for(int ii=0;ii{ for(int jj=0;jj<20;jj++) { fs.Read(buff0,0,2); datap[ii,jj]=getushortfrombyte(buff0); } fs.Read(buff0,0,1); dataxy[ii,0]=buff0[0]; fs.Read(buff0,0,1); dataxy[ii,1]=buff0[0]; fs.Read(buff0,0,1); datachar[ii]=buff0[0]; } datanum=allnum; fs.Close(); } /// /// 验证码图片 /// public System.Drawing.Bitmap bp =new System.Drawing.Bitmap(49,20); /// /// 特征库的长度 /// public static int datanum=0; /// /// 特征库数据 /// public static ushort[,] datap=new ushort[100000,20]; /// /// 长度与高度 /// public static byte[,] dataxy=new byte[100000,2]; /// /// 对应的字符 /// public static byte[] datachar=new byte[100000]; /// /// 等待处理的数据 /// public ushort[] datapic=new ushort[20]; /// /// 有效长度 /// public byte xlpic=0; /// /// 有效宽度 /// public byte ylpic=0; /// /// 检索特征库中存在的记录 /// public string getchar() { //如果查找不到,就返回空串 string jieguo=""; for(int ii=0;ii{ //统计一共有多少行的像素有差异,如果在4行以内就认为是存在该记录 //这种方法比较原始,但比较适合多线程时的运行,因为程序只进行简单的逻辑比较 //如果能够收集更多的特征库,识别率可以达到80%以上 //(此时可能需要将特征库的容量提高到15W个或以上) //当然也可以改进品配算法(如使用关键点品配),以用较少的特征库达到较高的识别率,但 //那样有比较大的机会造成识别错误并且多线程时占用较多CPU时间。 int notsamenum=0; if(dataxy[ii,0]!=xlpic || dataxy[ii,1]!=ylpic) { continue; } for(int jj=0;jj<20;jj++) { if(datap[ii,jj]!=datapic[jj]) { notsamenum++; } } if(notsamenum<4) { char cj=(char)datachar[ii]; return cj.ToString(); } } return jieguo; } /// /// 检查特征库中是否已经存在相关记录 /// bool ischardatain() { bool jieguo=false; for(int ii=0;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; } /// /// 添加到特征库中,并暂时将对应的字符置为空格以待人工识别 /// void adddatawithnullchar() { if(this.ischardatain()) { return; } for(int ii=0;ii<20;ii++) { datap[datanum,ii]=this.datapic[ii]; |