JAVA验证识别:基于jTessBoxEditorFX和Tesseract-OCR训练样本

工具准备:

jTessBoxEditorFX下载:https://github.com/nguyenq/jTessBoxEditorFX

Tesseract-OCR下载:https://sourceforge.net/projects/tesseract-ocr/

主要步骤:

  1. JTessBoxEditorFX,Tesseract-OCR(环境变量配置)下载,jar包准备(maven,见下面pom文件)
  2. 下载验证码到本地(代码)
  3. 转换验证码图片格式
  4. 将转换后的验证码去噪二值化,剪切边缘(代码)
  5. 使用jTessBoxEditorFX进行.box文件的校对(改正识别错误的验证码):https://www.cnblogs.com/zhongtang/p/5555950.html
  6. 使用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训练样本的更多相关文章

  1. Java 验证码识别库 Tess4j 学习

    Java 验证码识别库 Tess4j 学习 [在用java的Jsoup做爬虫爬取数据时遇到了验证码识别的问题(基于maven),找了网上挺多的资料,发现Tess4j可以自动识别验证码,在这里简单记录下 ...

  2. Java 验证码识别之多线程打码兔

    验证码识别,爬虫永远的话题~ 用打码兔总体的体验就是单线程速度太慢~ import java.io.IOException; import java.net.MalformedURLException ...

  3. Java验证码识别解决方案

    建库,去重,切割,识别. package edu.fzu.ir.test; import java.awt.Color; import java.awt.image.BufferedImage; im ...

  4. java验证码识别

    首先参考了csdn大佬的文章,但是写的不全ImgUtils类没有给出代码,无法进行了 写不完整就是制造垃圾 不过这个大佬又说这个大佬的文章值得参考于是又查看这篇文章 有案例https://blog.c ...

  5. Tesseract-OCR牛刀小试:模拟请求时的验证码识别

    原文:http://yaohuiji.com/tag/tesseract%EF%BC%8Cocr%EF%BC%8C%E9%AA%8C%E8%AF%81%E7%A0%81/ 有个邪恶的需求,需要识别验证 ...

  6. Python识别验证码,基于Tesseract实现图片文字识别

    一.简介 Tesseract是一个开源的文本识别[OCR]引擎,可通过Apache 2.0许可获得.它可以直接使用,或者使用API从图像中提取打印的文本,支持多种语言.该软件包包含一个ORC引擎[li ...

  7. ocr智能图文识别 tess4j 图文,验证码识别 分享及所遇到的问题

    自己对tess4j的使用总结 1,tess4j 封装了 tesseract-ocr 的操作 可以用很简洁的几行代码就实现原本tesseract-ocr 复杂的实现逻辑 如果你也想了解tesseract ...

  8. ocr智能图文识别 tess4j 图文,验证码识别

    最近写爬虫采集数据,遇到网站登录需要验证码校验,想了想有两种解决办法 1,利用htmlunit,将验证码输入到swing中,并弹出一个输入框,手动输入验证码,这种实现方式,如果网站需要登录一次可以使用 ...

  9. 零OCR基础6行代码实现C#验证码识别

    这两天因为工作需要,要到某个网站采集信息,一是要模拟登陆,二是要破解验证码,本想用第三方付费打码,但是想想网上免费的代码也挺多的,于是乎准备从网上撸点代码下来,谁知道,撸了好多个都不行,本人以前也没接 ...

随机推荐

  1. ERDAS IMAGINE 2014 32位 破解安装

    1.        安装Install ERDAS Foundation 2014 2.        安装ERDAS IMAGINE 2014  32位 3.        安装Intergraph ...

  2. 【转】Linux下RabbitMQ服务器搭建(单实例)

    阅读目录 系统环境 安装步骤 注意事项 参考资料 回到顶部 系统环境 操作系统:CentOS6.9 erlang:OTP 19.3 rabbitmq:rabbitmq-server 3.6.12 回到 ...

  3. 关于easyui表格右侧多出来的那一列。

    关于easyui表格右侧多出来的那一列,如下图,是给滚动条预留的位置,easyui表格默认就有的. 如果想要不显示:打开jQuery.easyui.min.js文件,找到wrap.width();所在 ...

  4. myeclipse调用loadrunner函数开发测试脚本

    myeclipse调用loadrunner函数开发测试脚本 一.使用myeclipse开发性能测试脚本 1.使用Eclipse新建一个Java工程,将目录%LoadRunner_Home%\class ...

  5. NopCommerce学习(1) Caching

    redis教程 http://www.runoob.com/redis/redis-tutorial.html 下载地址:https://github.com/MSOpenTech/redis/rel ...

  6. iOS dyld: Library not loaded 报错解决

    Xcode 用的是10.1 版本打的苹果包在 ios系统10.0 以上可以正常运行 但是系统9.3的手机安装后直接运行就崩溃 后来插上电脑联调 报错 dyld: Library not loaded: ...

  7. CentOS7安装Oracle11g R2

    文章摘抄自:一支小白,博客地址:http://www.cnblogs.com/startnow/p/7580865.html Centos7安装Oracle 11gR2     =========== ...

  8. 项目中cxf和weblogic整合时报错的问题

    GJYW项目使用的weblogic版本是10.3.6,cxf使用的版本是3.1.4 在将项目部署到weblogic服务器上时就会报错,通过下面的方式可以解决weblogic和cxf框架在一起报错的问题 ...

  9. iview admin 生成环境打包时路径问题

    关于生产打包路径不对,字体图标引用错误的问题.以下是解决方案供参考:1.webpack.base.config.js 17行修改为: path: path.resolve(__dirname, '.. ...

  10. vue---class和style的基本用法

    不多BB了 直接上代码了 通俗移动易懂总结了5种常用改变样式 的形式 <style> .actived2{ color:red; } </style> </head> ...