JAVA验证码识别:基于jTessBoxEditorFX和Tesseract-OCR训练样本
JAVA验证识别:基于jTessBoxEditorFX和Tesseract-OCR训练样本
工具准备:
jTessBoxEditorFX下载:https://github.com/nguyenq/jTessBoxEditorFX
Tesseract-OCR下载:https://sourceforge.net/projects/tesseract-ocr/
主要步骤:
- JTessBoxEditorFX,Tesseract-OCR(环境变量配置)下载,jar包准备(maven,见下面pom文件)
- 下载验证码到本地(代码)
- 转换验证码图片格式
- 将转换后的验证码去噪二值化,剪切边缘(代码)
- 使用jTessBoxEditorFX进行.box文件的校对(改正识别错误的验证码):https://www.cnblogs.com/zhongtang/p/5555950.html
- 使用tesseract命令行进行.traineddata的生成,然后在java中调用:https://www.cnblogs.com/zhongtang/p/5555950.html
代码如下:
package yanZhengMaTest.pikachu; import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL; import javax.imageio.ImageIO;
import javax.net.ssl.HttpsURLConnection; import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Rect;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc; import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException; public class Test { static {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}; // 用来调用OpenCV库文件,必须添加 public static void main(String[] args) throws FileNotFoundException, IOException, InterruptedException { //保存验证码的文件夹
File imgFile = new File("C:\\Users\\pc\\Desktop\\formPic\\unFormPic");
//验证码保存地址
String downAddress = "C:\\Users\\pc\\Desktop\\formPic\\unFormPic\\";
//验证码下载地址
String downURL = "https://www.qichamao.com/usercenter/varifyimage?t=0.6488481170232967";
if (imgFile.listFiles().length < 400) {
for (int i = 1; i <= 400; i++) {
downloadPic(downURL, downAddress + i + ".gif");
Thread.sleep(10 + (i % 100));
}
} //获取保存的验证码并转换为tif格式(Tesseract不支持识别gif图片)
File imgFile0 = new File("C:\\Users\\pc\\Desktop\\formPic\\unFormPic");
for (File image : imgFile0.listFiles()) {
changePicFormat("tif", image, "C:\\Users\\pc\\Desktop\\formPic\\formedPic\\");
}
System.out.println("图片格式转换成功"); //获取转换为tif格式后的验证码,并进行加工(图片去噪,二值化),增加验证码识别度
int picNum = 1;
File imageFile1 = new File("C:\\Users\\pc\\Desktop\\formPic\\formedPic");
for (File image : imageFile1.listFiles()) {
filterPic(image.getName(), picNum + ".tif");
picNum++;
} //获取加工后的
File resultImgs = new File("C:\\Users\\pc\\Desktop\\result_cut");
for (File link : resultImgs.listFiles()) {
String reslut = getResult(link);
System.out.println(link.getName() + "识别结果:" + reslut);
} } // 图片处理及处理后的图片储存
public static void filterPic(String imgName, String fileName) throws FileNotFoundException, IOException {
// 图片去噪
Mat src = Imgcodecs.imread("C:\\Users\\pc\\Desktop\\formPic\\formedPic\\" + imgName, Imgcodecs.IMREAD_UNCHANGED);
Mat dst = new Mat(src.width(), src.height(), CvType.CV_8UC1); if (src.empty()) {
System.out.println("没有图片");
} else {
System.out.println("图片处理成功");
} Imgproc.boxFilter(src, dst, src.depth(), new Size(3.2, 3.2));
Imgcodecs.imwrite("C:\\Users\\pc\\Desktop\\filter\\" + fileName, dst); // 图片阈值处理,二值化
Mat src1 = Imgcodecs.imread("C:\\Users\\pc\\Desktop\\filter\\" + fileName, Imgcodecs.IMREAD_UNCHANGED);
Mat dst1 = new Mat(src1.width(), src1.height(), CvType.CV_8UC1); Imgproc.threshold(src1, dst1, 165, 200, Imgproc.THRESH_TRUNC);
Imgcodecs.imwrite("C:\\Users\\pc\\Desktop\\process\\" + fileName, dst1); // 图片截取
Mat src2 = Imgcodecs.imread("C:\\Users\\pc\\Desktop\\process\\" + fileName, Imgcodecs.IMREAD_UNCHANGED);
Rect roi = new Rect(4, 2, src2.cols() - 7, src2.rows() - 4); // 参数:x坐标,y坐标,截取的长度,截取的宽度
Mat dst2 = new Mat(src2, roi); Imgcodecs.imwrite("C:\\Users\\pc\\Desktop\\result_cut\\" + fileName, dst2); } // 获取验证码
public static String getResult(File imageFile) {
if (!imageFile.exists()) {
System.out.println("图片不存在");
}
Tesseract tessreact = new Tesseract();
tessreact.setDatapath("F:\\Program Files (x86)\\Tesseract-OCR\\tessdata");
tessreact.setLanguage("fontyp"); //将默认库设置为自己训练的库 String result;
try {
result = tessreact.doOCR(imageFile);
return result;
} catch (TesseractException e) {
e.printStackTrace();
return null;
}
} /**
* 图片格式转换
*
* @param outputFormat
* 转换的格式
* @param file
* 要转换的图片
* @param downAddress
* 转换后保存的地址
* @sourse: http://www.open-open.com/code/view/1453300186683
*/
public static void changePicFormat(String outputFormat, File image, String downAddress) { try {
BufferedImage bim = ImageIO.read(image);
File output = new File(
downAddress + image.getName().substring(0, image.getName().lastIndexOf(".") + 1) + outputFormat);
ImageIO.write(bim, outputFormat, output);
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 下载验证码
*
* @param picUrl
* 验证码获取地址
* @param address
* 图片保存地址
*/
public static void downloadPic(String picUrl, String imgAddress) {
try {
URL url = new URL(picUrl);
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
//需要设置头信息,否则会被识别为机器而获取不到验证码图片
conn.setRequestProperty("User-Agent",
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36");
conn.connect(); int result = -1;
byte[] buf = new byte[1024];
BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());
FileOutputStream fos = new FileOutputStream(imgAddress);
while ((result = bis.read(buf)) != -1) {
fos.write(buf);
}
fos.flush(); fos.close();
bis.close();
System.out.println("图片下载成功");
} catch (MalformedURLException e) {
System.out.println("图片读取失败");
e.printStackTrace();
} catch (IOException e) {
System.out.println();
e.printStackTrace();
}
} }
pom文件:
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>4.1.1</version>
<exclusions>
<exclusion>
<groupId>com.sun.jna</groupId>
<artifactId>jna</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.openpnp</groupId>
<artifactId>opencv</artifactId>
<version>3.2.0-0</version>
</dependency>
参考文章:
opensv的使用:https://blog.csdn.net/u012706811/article/details/52779271
opensv教程:https://www.w3cschool.cn/opencv/opencv-me9i28vh.html
opensv二值化:https://blog.csdn.net/liyuqian199695/article/details/53925046
opensv的maven地址:https://mvnrepository.com/artifact/org.openpnp/opencv/3.4.2-0
opensv图片过滤:https://blog.csdn.net/u012393192/article/details/78528550
opensv图片修剪:https://blog.csdn.net/sileixinhua/article/details/72811093
opensv案例含tesserate命令:https://www.cnblogs.com/zhongtang/p/5555950.html 附好文:https://blog.csdn.net/lmj623565791/article/details/23960391
异常处理:
1. 加载库异常:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no opencv_java320
in java.library.path at
java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867) at
java.lang.Runtime.loadLibrary0(Runtime.java:870) at
java.lang.System.loadLibrary(System.java:1122) at
yanZhengMaTest.pikachu.Test.<clinit>(Test.java:38)
解决:
将以下图片位置的路径设置为:G:\Program Files (x86)\apache-maven\repo\org\openpnp\opencv\3.2.0-0\opencv-3.2.0-0\nu\pattern\opencv\windows\x86_64(根据自己maven的opencv包地址进行指定)。

2. jdk版本和opencv版本不匹配(Exception in thread "main" java.lang.UnsatisfiedLinkError: no jniopencv_highgui in java.library.path)
解决:更换opencv版本
3. 使用命令行生成.tr文件时候出现异常:
Page 406
Warning. Invalid resolution 1 dpi. Using 70 instead.
Estimating resolution as 269
Error during processing.
解决:可能图片转换格式或者下载的时候出错,将图片替换即可
JAVA验证码识别:基于jTessBoxEditorFX和Tesseract-OCR训练样本的更多相关文章
- Java 验证码识别库 Tess4j 学习
Java 验证码识别库 Tess4j 学习 [在用java的Jsoup做爬虫爬取数据时遇到了验证码识别的问题(基于maven),找了网上挺多的资料,发现Tess4j可以自动识别验证码,在这里简单记录下 ...
- Java 验证码识别之多线程打码兔
验证码识别,爬虫永远的话题~ 用打码兔总体的体验就是单线程速度太慢~ import java.io.IOException; import java.net.MalformedURLException ...
- Java验证码识别解决方案
建库,去重,切割,识别. package edu.fzu.ir.test; import java.awt.Color; import java.awt.image.BufferedImage; im ...
- java验证码识别
首先参考了csdn大佬的文章,但是写的不全ImgUtils类没有给出代码,无法进行了 写不完整就是制造垃圾 不过这个大佬又说这个大佬的文章值得参考于是又查看这篇文章 有案例https://blog.c ...
- Tesseract-OCR牛刀小试:模拟请求时的验证码识别
原文:http://yaohuiji.com/tag/tesseract%EF%BC%8Cocr%EF%BC%8C%E9%AA%8C%E8%AF%81%E7%A0%81/ 有个邪恶的需求,需要识别验证 ...
- Python识别验证码,基于Tesseract实现图片文字识别
一.简介 Tesseract是一个开源的文本识别[OCR]引擎,可通过Apache 2.0许可获得.它可以直接使用,或者使用API从图像中提取打印的文本,支持多种语言.该软件包包含一个ORC引擎[li ...
- ocr智能图文识别 tess4j 图文,验证码识别 分享及所遇到的问题
自己对tess4j的使用总结 1,tess4j 封装了 tesseract-ocr 的操作 可以用很简洁的几行代码就实现原本tesseract-ocr 复杂的实现逻辑 如果你也想了解tesseract ...
- ocr智能图文识别 tess4j 图文,验证码识别
最近写爬虫采集数据,遇到网站登录需要验证码校验,想了想有两种解决办法 1,利用htmlunit,将验证码输入到swing中,并弹出一个输入框,手动输入验证码,这种实现方式,如果网站需要登录一次可以使用 ...
- 零OCR基础6行代码实现C#验证码识别
这两天因为工作需要,要到某个网站采集信息,一是要模拟登陆,二是要破解验证码,本想用第三方付费打码,但是想想网上免费的代码也挺多的,于是乎准备从网上撸点代码下来,谁知道,撸了好多个都不行,本人以前也没接 ...
随机推荐
- java 企业门户网站 源码 自适应响应式 freemarker 静态引擎 html5 SSM
官网 http://www.fhadmin.org/ 系统介绍: 1.网站后台采用主流的 SSM 框架 jsp JSTL,网站后台采用freemaker静态化模版引擎生成html 2.因为是生成的ht ...
- C++笔记014:C++对C的扩展——新增数据类型bool类型
原创笔记,转载请注明出处! 点击[关注],关注也是一种美德~ 1.C++在C语言的基本类型系统之上增加了bool类型. 2.C++中的bool类型变量可取的值只有true 和false,true代表真 ...
- MySQL->处理重复数据[20180517]
限制数据重复的方式:表上增加主键(Primary Key)或增加唯一性索引(Unique) 主键对重复资料进行限制,这样资料在导入时就无法重复插入 create table primary_t ...
- 创建Podfile,添加类库,中途添加库指令
前提是你电脑已经安装了CocoaPods 1.打开终端 2.进入你的工程目录 cd /Users/...../CocoaPodsDemo 3. 创建Pods文件 touch Podfile 新建 ...
- css中可以继承的属性
声明 : 本文源于https://www.cnblogs.com/thislbq/p/5882105.html CSS中可以和不可以继承的属性 一.无继承性的属性 1.display:规定元素应该 ...
- PHP 变量分页标签页面源代码技术分享
最近在研究PHP的常规变量的分页源代码. 现在发布一个给大家看一下. defined('IN_DUOAO') or exit('No permission resources.');$smarty ...
- 全局变量和局部变量(global关键字)
1.定义在函数外部的就是全局变量,它的作用域从定义处一直到文件结尾. 2.函数内定义的变量就是局部变量,它的作用域为函数定义范围内. 3.函数之间存在作用域互不影响. 4.函数内访问全局变量需要 gl ...
- 一图看懂hadoop分布式文件存储系统HDFS工作原理
一图看懂hadoop分布式文件存储系统HDFS工作原理
- Hbase(2)-HBase简介
一. HBase的特点 1. 海量存储 Hbase适合存储PB级别的海量数据,在PB级别的数据以及采用廉价PC存储的情况下,能在几十到百毫秒内返回数据.这与Hbase的极易扩展性息息相关.正式因为Hb ...
- Python-条件语句和循环语句
·条件语句 笔记: If 布尔值: print(‘hello,world!’) 当表达式为布尔表达式时,Flase None 0 ”” () [] {} 都视为假! @ ...