Java使用test4j识别验证码
test4j的集成
此处使用了拷入test4j的项目文件集成到自己的项目中去。
1.去test4j官网下载test4j的zip文件(我下载的是3.4.8的版本);
2.解压缩文件,得到以下目录
需要拷贝到项目中的文件.png
3.把lib里面的jar包加入项目中,scr下的代码文件copy到项目中,tessdata文件copy到项目中(跟src同级目录)。(tessdata就是训练文件,英文识别较为准确,中文识别准确率一般)
4.dist 目录下的test4j-3.4.8.jar文件添加到项目中;
5.识别验证码
import java.io.File;
import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
public class Test {
public static void main(String[] args) {
System.out.println("HelloWord");
// 1.创建 ITesseract 验证码识别类
ITesseract instance = new Tesseract();
// 2.创建文件
File newFile = new File("my//我是1.jpg");
// 3.开始识别
try {
String codeString = instance.doOCR(newFile);
System.out.println("识别内容是:" + codeString);
} catch (TesseractException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
关于错误:Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'libtesseract304': Native library (win32-x86-64/libtesseract304.dll) not found in resource path;
只要是按照我这个方法来集成一般不会出现这种问题,出现这种问题有可能是因为test4j的jar文件导致的,一定要去官网下载,尽可能不去copy别人项目中的;
解决方法:你在官网下载的zip文件lib目录中有一个(win32-x86-64)的文件夹,把他拷贝到项目的bin目录下就行了;
注意不同版本的(win32-x86-64)文件下的那个文件名可能不一致;(版本有差异)
例如:
test4j 3.4.8版本下(lib/win32-x86-64)文件夹下的名字是:libtesseract3051.dll
test4j 3.1版本下(lib/win32-x86-64)文件夹下的名字是:libtesseract304.dll
7.test4j 不识别问题,图片的格式改成 jpg,
带背景验证码.jpg
简单验证码.png
能识别带背景的验证码,却不能识别只有几个噪点的验证码,我用ps改成jpg格式的立马就识别出来了
验证码的预处理
虽然test4j可以识别一些简单验证码,对于复杂的识别率还是不高,为了提高识别成功率,识别前,对图片进行处理,例如去除噪点,去除背景线等;
我这边只需要实现识别简单验证码的功能,所以我的这个预处理不一定适合你。
上面简单验证码的特点分析:验证码数字是红色不会变,背景纯白色,有一些零散的噪点,噪点的颜色不确定,彩色噪点;
实现思路:遍历每一个像素点,判断是不是红色Rgb(255,0,0)的(说明是验证码的颜色),转化为黑色,其他颜色转化为白色,这样识别成功率大大提高,得到的验证码如下:
改变颜色之后的验证码.jpg
/**
* 去除噪点
*
* @param img 需要去除噪点的文件
*/
private static void getAuthCode() {
BufferedImage img = ImageIO.read(new File("my//" + fileName));
// 获取图片的高宽
int width = img.getWidth();
int height = img.getHeight();
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
Color color = new Color(img.getRGB(x, y));
// System.out.println("我是颜色:::" + color + "我是位置x:" + x + ",y=" + y);
// 判断色值是不等于白色,不等于白色进行下一步判断(其他颜色)
if (color.getRGB() != Color.WHITE.getRGB()) {
// 判断颜色是否等于红色,(红色就是验证码的颜色)
if (color.getRGB() == Color.RED.getRGB()) {
// 等于红色设置为黑色
img.setRGB(x, y, Color.BLACK.getRGB());
} else {
// img.setRGB(x, y, Color.white.getRGB());
// 不等于红色,设置为白色
img.setRGB(x, y, Color.WHITE.getRGB());
}
} else {
// 是白色,继续设置为白色
img.setRGB(x, y, Color.WHITE.getRGB());
// System.out.println("else执行了吗");
}
}
}
}
//图片转化格式
BufferedImage img;
try {
img = ImageIO.read(new File("png图片地址xx.png"));
if (!newFile.exists()) {
File dir = newFile.getParentFile();
if (!dir.exists()) {
dir.mkdirs();
}
newFile.createNewFile();
//保存为jpg格式
ImageIO.write(img, "jpg", newFile);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
欢迎留言沟通交流,下一篇准备写去除噪点的文章。
End