声明:此验证码识别教程及代码仅供学习使用,不得用于其他用途。
一、获取验证码图片
这一步需要用到HttpClient,下载到的压缩文件里有多个Lib,我们只需要使用到其中的 httpcore-4.4.9.jar、 httpclient-4.5.5.jar、 commons-logging-1.2.jar。
这时候需要知道正方教务系统验证码的链接,一般都是正方教务系统链接后面加上/CheckCode.aspx就是验证码的获取路径。
通过MySetting类可以方便的更改核心的参数。这里稍微说明下,建议先获取100张验证码照片,之后按照教程的过程进行;之后再获取500张验证码照片,再按照教程的过程进行一遍;最后获取1000张验证码照片,再进行一遍。这样借助循序渐进的过程,可以减少人力的付出,减少操作过程的人为错误,最后也可拥有丰富的字模。
另外需要额外执行一次,将验证码图片保存至RES\imgTEST中,以备最后进行准确率检测。
package getCode;
public class MySetting {
public static String IMG_1K = "RES\\img1K\\";
// 从正方教务验证码直接获取的验证码GIF格式图片
public static String IMG_TEST = "RES\\imgTEST\\";
// 验证码识别测试集
public static String SECRETCODE_URL = "http://jwxt.domain.edu.cn/CheckCode.aspx";
// 正方教务验证码URL链接
}
package getCode;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
public class getCodeIMG {
public static void main(String[] args) throws IOException {
for (int i = 0; i < 1000; i++) {
String SECRETCODE_URL = MySetting.SECRETCODE_URL;
HttpGet secretCodeGet = new HttpGet(SECRETCODE_URL);
CloseableHttpClient client = HttpClients.createDefault();
CloseableHttpResponse responseSecret = client.execute(secretCodeGet);
FileOutputStream fileOutputStream = new FileOutputStream(new File(MySetting.IMG_1K + "Code" + i + ".gif"));
responseSecret.getEntity().writeTo(fileOutputStream);
fileOutputStream.close();
System.out.println("Code" + i + ".gif");
}
System.out.println("Finish!");
}
}
到这里,我们就很快的获取了100张/500张/1000张的验证码的GIF照片了。
二、转换验证码图片格式为PNG
这步应该是可有可无的,由于起初想借助腾讯优图辅助我完成验证码图片的标签添加,因此我先将验证码图片从GIF转换为PNG格式。
package getCode;
public class MySetting {
public static String IMG_1K = "RES\\img1K\\";
// 从正方教务验证码直接获取的验证码GIF格式图片
public static String IMG_PNG_1K = "RES\\imgPNG1K\\";
// PNG格式的验证码图片
public static String IMG_TEST = "RES\\imgTEST\\";
// 验证码识别测试集
public static String IMG_PNG_TEST = "RES\\imgPNGTEST\\";
// PNG格式验证码识别测试集
public static String SECRETCODE_URL = "http://jwxt.domain.edu.cn/CheckCode.aspx";
// 正方教务验证码URL链接
}
package getCode;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.imageio.ImageIO;
public class gifToPNG {
public static void main(String[] args) throws IOException {
for (int i = 0; i < 1000; i++) {
OutputStream out = new FileOutputStream(MySetting.IMG_PNG_1K + "Code" + i + ".png");
ImageIO.write(ImageIO.read(new File(MySetting.IMG_1K + "Code" + i + ".gif")), "png", out);
out.close();
System.out.println("Now:" + i);
}
System.out.println("Finish");
}
}
这时已经在RES\imgPNG1K文件下获得了所有PNG格式的文件了。
三、生成字模与识别
正方教务系统的验证码总体来看,是比较好进行处理的。四个字符的颜色均为纯蓝色,因此只需要去除背景上的噪点,再进行二值化处理为黑白图片,最后进行分割图片即可得到字模。
(一)、添加标签
这个就需要依次给验证码重命名为正确的答案以作为标签,但是现在你可以直接使用我生成的字模来自动生成标签,再检查一遍即可。(由于需要人工校验的验证码实在太多,附件中1千个已经添加标签的验证码中可能存在少量错误,这会影响到字模的准确性,如果大家发现了RES\imgPNG1K中标签的错误,感谢大家在文章下方进行评论)
(二)、图像的预处理
图像的预处理过程包括了去除背景噪点及黑白二值化两个关键点。
public static BufferedImage removeBackgroud(String picFile) throws Exception {
BufferedImage img = ImageIO.read(new File(picFile));
int width = img.getWidth();
int height = img.getHeight();
for (int x = 0;