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#验证码识别
这两天因为工作需要,要到某个网站采集信息,一是要模拟登陆,二是要破解验证码,本想用第三方付费打码,但是想想网上免费的代码也挺多的,于是乎准备从网上撸点代码下来,谁知道,撸了好多个都不行,本人以前也没接 ...
随机推荐
- My97datepicker使用方法
My97DatePicker是一款非常灵活好用的日期控件.使用非常简单. 1.下载My97DatePicker组件包 2.在页面中引入该组件js文件: <script type=&quo ...
- linux 下 chkconfig安装与使用详解
chkconfig 安装 开始的时候因为Raspbian的原因,系统是不自带chkconfig这个命令的, root@raspberrypi:~# chkconfig-bash: chkconfig: ...
- jmeter接口测试1-参数化
jmeter一个简单的接口测试例子 1.创建一个http请求: 大概的步骤就是: (1)创建一个线程组 (2)添加HTTP信息头管理器:右键线程组,选择,添加user-Agent,key-value形 ...
- Java 读取properties
package Db; import java.io.InputStream; import java.util.Properties; import java.io.BufferedReader; ...
- Eclipse配置多个Tomcat服务器
我们在开发大型web项目时,经常需要在eclipse中同时启动多个tomcat服务器来开启多个服务.这里讲解一下如何在eclipse中配置多个tomcat服务器. 配置步骤 1. 在tomcat官网( ...
- Scanner(基本用法初学)
package day01; import java.util.Scanner; public class Case05 { public static void main(String[] args ...
- Oracle 执行计划的查看方式
访问数据的方法:一.访问表的方法:1.全表扫描,2.ROWID扫描 二.访问索引的方法:1.索引唯一性扫描,2.索引范围扫描,3.索引全扫 ...
- select 宽度跟随option内容自适应
传统的select在没有设置固定宽度的情况,会因为自身的 option 选项的里,宽度最宽的option作为select本身的宽度 例如 可见效果为: select的宽度因为"宽度最宽的op ...
- [转]Python爬虫html解析工具beautifulSoup在pycharm中安装及失败的解决办法
原文地址:https://www.cnblogs.com/yysbolg/p/9040649.html 刚开始学习一门技术最麻烦的问题就是搞定IDE环境,直接在PyCharm里安装BeautifulS ...
- PG 存储函数调用变量的3种方法。
一.假设有表student,字段分别有id,remark,name等字段. 二.写一个存储函数,根据传过去的变量ID更新remark的内容. 调用该存储函数格式如下:select update_st ...