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

对于最简单的无干扰背景的验证码,使用tesseract-ocr可以识别,但是带有干扰像素点的验证码,tesseract-ocr识别不出来,可以用机器学习尝试破解,然而短时间可以尝试以下更简单的方法,以下方法,前提是主机上已经安装过tesseract并且配置过环境变量
如下
之后可以自己写bat脚本测试一下是否可行,详细用法请自行百度:
1.简单的无干扰数字验证码(此时背景为纯白色,无色素点干扰):可以识别
2.带有背景色素点的验证码(并且数字和背景颜色相近,机器很难识别):识别不出来
将彩色图片灰度化处理,变为黑白两色,如下:
此时再调用tesseract-ocr解析所有的验证码,结果如下
D686
5764
8558
9974
4149
D746
4592
5355
1891
2-528
7040
8944
4596
2895
1887
发现解析成功率已经很高了
之后修改指令参数来限制验证码的类型为数字,解析的类型为数字,这样就不会吧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,注意备注信息哦

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值