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#验证码识别
这两天因为工作需要,要到某个网站采集信息,一是要模拟登陆,二是要破解验证码,本想用第三方付费打码,但是想想网上免费的代码也挺多的,于是乎准备从网上撸点代码下来,谁知道,撸了好多个都不行,本人以前也没接 ...
随机推荐
- fpn
class-aware detector 和 class-agnostic detector:https://blog.csdn.net/yeyang911/article/details/68484 ...
- 关于RAM与ROM的区别与理解
随机存取存储器(random access memory,RAM)又称作“随机存储器”,是与CPU直接交换数据的内部存储器,也叫主存(内存).它可以随时读写,而且速度很快,通常作为操作系统或其他正在运 ...
- TCP连接三次握手协议,释放连接四次挥手,以及使用 awl伪造mac地址进行多线程syn洪泛攻击。
这个TCP连接就是一次追女生-谈恋爱-分手,追求比分手简单,但是分手比追求复杂.哥,谈了半年的女朋友,在就快要成功了的时候分了,原因是因为有人在后面该老子背后搞SYN洪泛攻击,最后女朋友丢失了.学会T ...
- ansible实用例子
寻找/etc/ 名为"hosts" 递归查找 ansible webserver -m find -a ' path=/etc/ file_type=any recurse=yes ...
- oracle 查看表空间以及剩余量
--1.查看表空间的名称及大小 SELECT t.tablespace_name, round(SUM(bytes / (1024 * 1024)), 0) ts_size FROM dba_tabl ...
- Linux内存管理-高端内存(一)
高端内存是指物理地址大于 896M 的内存.对于这样的内存,无法在“内核直接映射空间”进行映射. 为什么? 因为“内核直接映射空间”最多只能从 3G 到 4G,只能直接映射 1G 物理内存,对于大于 ...
- eclipse删除的文件如何恢复。
1.如果不小心删除了单个文件或者文件夹. 鼠标点击上级目录 Ctrl+z就可以恢复了. 如果没有恢复,就右击项目,选择Resore from Local History 然后选择你所删除的文件,选择恢 ...
- 【.net开发者自学java系列】使用Eclipse开发SpringMVC(2)
大概熟悉了 Eclipse. 然后先上Spring MVC 官网看看. 可是英文太差?翻译咯.现在翻译可屌了,真高兴生活在现在科技发达的时代.活着在中国太美好了. 没出过国门就能看懂英文.我都崇拜自己 ...
- 关于keil不同容量和不同引脚大小的编译以及下载出错问题
如果遇到这个问题一般可能有四个原因(以STM32F103C8T6为例) 1.芯片型号没有选对 2.startup文件可能没有选对,startup文件常用的分为3种,startup_stm32f10x_ ...
- css模型框
在 CSS 中,width 和 height 指的是内容区域的宽度和高度.增加内边距.边框和外边距不会影响内容区域的尺寸,但是会增加元素框的总尺寸. 假设框的每个边上有 10 个像素的外边距和 5 个 ...