Java实现正方教务验证码的识别

本文详细介绍了使用Java实现正方教务系统验证码的识别过程,包括获取验证码图片、转换格式、生成字模、识别验证码、添加标签、校验工具和准确率计算。通过图像预处理、切割、比较字模库进行识别,实现较高准确率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

声明:此验证码识别教程及代码仅供学习使用,不得用于其他用途。
一、获取验证码图片

     这一步需要用到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; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值