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