数字验证码的识别
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字验证码的识别
数字验证码很多地方都会用到,我前段时间也写过一篇有关于生成验证码的文章,那是随机生成大小不一,颜色不一,形状不一的数字图片,本文主要是针对那些比较规范的验证码的识别,何谓规范?规范就是数字的大小几乎一致,颜色对比度挺高,没什么干扰线.识别的依据就是最最最基础的办法,比对,先取样,保存成字模,再用字模去和将要识别的图片进行比较,取最接近的那个结果.不过在比较之前必须得到图片里面的数据提取出来并适当地去除一些干扰.
下面就是识别部份的代码:
/*
* ImageCode.java
*
* Created on 2007年1月18日, 下午10:00
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package net.bccn.hadeslee.programfan;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import .URL;
import javax.imageio.ImageIO;
/**
* 验证码识别程序
* @author hadeslee
*/
public class ImageCode {
private BufferedImage bi;
private static int[][][] model=new int[5][10][208];
//静态初始化块
static{
initNumModel();
}
/**
* Creates a new instance of ImageCode
*/
public ImageCode() {
initNumModel();
}
public String getNumber(InputStream is){
try{
bi= ImageIO.read( is );
final StringBuffer sb=new StringBuffer();
for(int i=0;i<4;i++){
int[] data=this.getData(i);
sb.append(this.doCheck(data));
}
return sb.toString();
} catch(Exception exe){
exe.printStackTrace();
return "";
}
}
/**
* 重载的方法,根据传进来的参数得到返回的字符串 * @param bi
* @return结果
*/
public String getNumber(BufferedImage bi){
try{
this.bi= bi;
StringBuffer sb=new StringBuffer();
for(int i=0;i<4;i++){
int[] data=this.getData(i);
sb.append(this.doCheck(data));
}
//System.out.println(sb.toString());
return sb.toString();
} catch(Exception exe){
exe.printStackTrace();
return "";
}
/**
* 静态初始化方法,
* 用于初始化字模
*/
private static void initNumModel(){
try{
//System.out.println("初始化model");
for(int i=0;i<10;i++){
StreamTokenizer st=new StreamTokenizer(new InputStreamReader(ImageCode.class.getRes ourceAsStream("/net/bccn/hadeslee/model/programfan_"+i+".mod")));
st.whitespaceChars('#','#');
st.whitespaceChars(',',',');
st.eolIsSignificant(false);
out:while(true){
int token=st.nextToken();
if(token==StreamTokenizer.TT_WORD){
int who=0;
int index=0;
if(st.sval.equals("center")){
who=0;
}else if(st.sval.equals("left")){
who=1;
}else if(st.sval.equals("right")){
who=2;
}else if(st.sval.equals("up")){
who=3;
}else if(st.sval.equals("down")){
who=4;
}
while(st.nextToken()==StreamTokenizer.TT_NUMBER){
model[who][i][index++]=(int)st.nval;
}
st.pushBack();
}else if(token==StreamTokenizer.TT_EOF){
break out;
}
}
}
} catch(Exception exe){