RSS
热门关键字:  java  Ajax  JSP  JSF  Struts
当前位置 : 首页>Java>列表

数字验证码的识别

来源: 作者: 时间:2007-09-28 点击:
  数字验证码很多地方都会用到,我前段时间也写过一篇有关于生成验证码的文章,那是随机生成大小不一,颜色不一,形状不一的数字图片,本文主要是针对那些比较规范的验证码的识别,何谓规范?规范就是数字的大小几乎一致,颜色对比度挺高,没什么干扰线.识别的依据就是最最最基础的办法,比对,先取样,保存成字模,再用字模去和将要识别的图片进行比较,取最接近的那个结果.不过在比较之前必须得到图片里面的数据提取出来并适当地去除一些干扰.

下面就是识别部份的代码:

/*
* 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 java.net.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.getResourceAsStream("/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){
exe.printStackTrace();
}
//System.out.println("初始化结束model");
}



//通过传进来的字符串得到BufferedImage对象
private BufferedImage getBI(String url){
try {
return ImageIO.read(new URL(url));
} catch (IOException ex) {
ex.printStackTrace();
return null;
}
}



/**根据索引得到
*某一块的图像转为数组
*的文件
*/
private int[] getData(int index){
BufferedImage sub=bi.getSubimage(index*16,0,16,13);
int iw=sub.getWidth();
int ih=sub.getHeight();
int[] demo=new int[iw*ih];
for(int i=0; i for(int j=0; j demo[i*iw+j]=(sub.getRGB(j,i)==-1?0:1);

共3页: 上一页 1 [2] [3] 下一页
最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册