1、Tess4j
最近在GitHub上看到一个图像识别的开源框架tess4j,而且是Java版的,为此利用此框架来识别验证码中的信息,利用它提供的字体库,来提取信息,对于没有什么干扰线的验证码准确率还是蛮高的,对于有一些干扰线的就差一些,不过也可以能通过训练字体库,从而可以提高准确率的。
根据范例,写了一个简单的提取验证码信息的工具类VerificationCode:
主要是用这个类的extract方法,这个方法有3个参数:
第1个参数是指定图片的路径
第2个参数是指定字体库的,其中chi_sim表示中文简体,eng表示英文
第3个参数是指定是否需要去除干扰线,true表示需要,false表示不需要
package com.swnote.tess4j.test;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import com.recognition.software.jdeskew.ImageDeskew;
import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.util.ImageHelper;
/**
* 识别验证码
*
* @author lzj
* @date [2019-03-03]
*/
public class VerificationCode {
/**
* 配置文件
*/
private static String config_path = "src/main/resources";
/**
* 调整倾斜度的阈值
*/
private static double deskew_threshold = 0.05d;
/**
* 提取验证码图片中的文字
*
* @param img_path
* @param lang
* @param clear
* @return
*/
public static String extract(String img_path, String lang, boolean clear) throws Exception {
// 图片文件
File img = new File(img_path);
if (clear) {
// 将去除干扰后的图片保存在同级目录下的ext目录下
String ext_path = img.getParentFile().getPath() + "/ext";
// 去除干扰
CleanImage.cleanLinesInImage(img, ext_path);
// 处理后的图片
img = new File(ext_path, img.getName());
}
// 设置语言库
ITesseract instance = new Tesseract();
File directory = new File(config