您的位置:首页 > 编程语言 > Java开发

tesseract破解验证码,java代码源码

2018-02-09 09:57 831 查看
对于最简单的无干扰背景的验证码,使用tesseract-ocr可以识别,但是带有干扰像素点的验证码,tesseract-ocr识别不出来,可以用机器学习尝试破解,然而短时间可以尝试以下更简单的方法,以下方法,前提是主机上已经安装过tesseract并且配置过环境变量如下




之后可以自己写bat脚本测试一下是否可行,详细用法请自行百度:1.简单的无干扰数字验证码(此时背景为纯白色,无色素点干扰):可以识别

2.带有背景色素点的验证码(并且数字和背景颜色相近,机器很难识别):识别不出来


将彩色图片灰度化处理,变为黑白两色,如下:

此时再调用tesseract-ocr解析所有的验证码,结果如下D6865764855899744149D7464592535518912-52870408944459628951887发现解析成功率已经很高了之后修改指令参数来限制验证码的类型为数字,解析的类型为数字,这样就不会吧0解析为D,还有‘-’这样的多余符号应该是杂点造成的,可以用字符串操作去除掉,所以解析率也有90%以上了。
java代码
package com.fsc.captcha;

import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.color.ColorSpace;
import java.awt.image.BufferedImage;
import java.awt.image.ColorConvertOp;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.imageio.ImageIO;

public class CaptchaParse {

/**
* @param imagePath 要解析的图片路径(灰度化以后)
* @param resultPath 解析后的文本文件路径
* @return
*/
public static String parse(String imagePath,String resultPath){
try {
String language = "-l eng";
Runtime runtime = Runtime.getRuntime();
String command = "tesseract" + " " + imagePath + " " + resultPath.substring(0,resultPath.indexOf(".")) +" "+ language;
Process ps = runtime.exec(command);
ps.waitFor();
String code = GetFile.getCode(resultPath.substring(0,resultPath.indexOf("."))+".txt");
System.out.println(code);
return code;
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return "";
}
public static String parse(String imagePath){
return parse(imagePath,imagePath.substring(0,imagePath.indexOf(".")));
}
/**
* @param image
* @param imgFilePath
* @function 将彩色图片灰度处理
* @return
*/
public static void getCaptcha(String image, String imgFilePath) {
File file = new File(image);
BufferedImage bi = null;
try {
bi = ImageIO.read(file);
bi = grayImage(bi);
ImageIO.write(bi, image.substring(image.indexOf(".")+1), new FileOutputStream(imgFilePath));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* @param srcImg
* @function 用于将彩色图片灰度处理,返回黑白图片
* @return
*/
public static BufferedImage grayImage(final BufferedImage srcImg) {
int iw = srcImg.getWidth();
int ih = srcImg.getHeight();
Graphics2D srcG = srcImg.createGraphics();
RenderingHints rhs = srcG.getRenderingHints();
ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
ColorConvertOp theOp = new ColorConvertOp(cs, rhs);
BufferedImage dstImg = new BufferedImage(iw, ih,BufferedImage.TYPE_INT_RGB);
theOp.filter(srcImg, dstImg);
return dstImg;
}
public static void main(String[] args) {
File file = new File("D:\\captcha\\src");
String[] list = file.list();
for(int i=0;i<list.length;i++){
getCaptcha("D:\\captcha\\src\\"+list[i],"D:\\captcha\\parse\\"+list[i].replaceAll(" ", ""));
parse("D:\\captcha\\parse\\"+list[i].replaceAll(" ", ""),"D:\\captcha\\text\\"+list[i].replaceAll(" ", ""));
}
}
}

自己可以去别的地方下载tesseract和相应语言包,验证码素材可以自己找
推荐一个简单的网站获取验证码http://claim.chinalife-p.com.cn/claimCarFlow/index.jsp
代码中的图片素材我已经上传到百度网盘,可以自行下载https://pan.baidu.com/s/1eSS8McE 密码:i5v3,目录结构如下,src放原始文件,parse中放解析后的黑白图片,text中存放解析后验证码字符串,自己可以采集验证码放到src中:



如果还有问题,可以联系本人QQ:1464393873,注意备注信息哦
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息