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

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.

解决:可能图片转换格式或者下载的时候出错,将图片替换即可

原文地址:https://www.cnblogs.com/zengbojia/p/9470214.html

时间: 2024-09-29 04:06:02

JAVA验证码识别:基于jTessBoxEditorFX和Tesseract-OCR训练样本的相关文章

(转)java验证码识别

java验证码识别--1 http://blog.csdn.net/problc/article/details/5794460 java验证码识别--2 http://blog.csdn.net/problc/article/details/5797507 java验证码识别--3 http://blog.csdn.net/problc/article/details/5800093 java验证码识别--4 http://blog.csdn.net/problc/article/detail

基于Tesseract OCR的文字识别Android应用开发资料整理

前言 一.Tesseract OCR引擎 Tesseract OCR是HP公司于1985~1995年间开发的商业级OCR(Optical Character Reader, 光学字符阅读器)引擎,并于2005年开放源代码.以下是它sourceforge上的网址: http://sourceforge.net/projects/tesseract-ocr/?source=directory 现在已转移到谷歌的代码服务下: https://code.google.com/p/tesseract-oc

利用jTessBoxEditor工具进行Tesseract3.02.02样本训练,提高验证码识别率,tesseract训练样本

http://www.bkjia.com/Pythonjc/1131343.html 利用jTessBoxEditor工具进行Tesseract3.02.02样本训练,提高验证码识别率,tesseract训练样本 1.背景 前文已经简要介绍tesseract ocr引擎的安装及基本使用,其中提到使用-l eng参数来限定语言库,可以提高识别准确率及识别效率. 本文将针对某个网站的验证码进行样本训练,形成自己的语言库,来提高验证码识别率. 2.准备工具 tesseract样本训练有一个官方流程说明

【验证码】使用Tesseract实现简单的验证码识别

1.Tesseract介绍: Tesseract的OCR引擎最先由HP实验室于 1985年开始研发,至1995年时已经成为OCR业内最准确的三款识别引擎之一.然而,HP不久便决定放弃OCR业务,Tesseract也从此尘封. 数年以后,HP意识到,与其将Tesseract束之高阁,不如贡献给开源软件业,让其重焕新生--2005年,Tesseract由美国内华达州信息技 术研究所获得,并求诸于Google对Tesseract进行改进.消除Bug.优化工作. 2.下载 Tesseract: http

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

这两天因为工作需要,要到某个网站采集信息,一是要模拟登陆,二是要破解验证码,本想用第三方付费打码,但是想想网上免费的代码也挺多的,于是乎准备从网上撸点代码下来,谁知道,撸了好多个都不行,本人以前也没接触过这方面的,代码无从下手,最后不知道在哪个兄台博客找到一个国外的第三方开源OCR,说是强大的谷歌公司做维护,C++开发的,有.NET封装的链接库,甚好! 项目地址:https://github.com/tesseract-ocr/tesseract语言库:https://github.com/te

atitit.验证码识别step3----去除边框---- 图像处理类库 attilax总结java版本

atitit.验证码识别step3----去除边框---- 图像处理类库 attilax总结java版本 1. 去除边框思路原理 1 2. Thumbnailator 是一个用来生成图像缩略图.裁切.旋转.添加水印等操作 2 3. OpenCL的Java库 JavaCL 2 4. Java Image Filters是一款基于Java的图像处理类库,特别是在图像滤镜特效方面, 2 4.1.1. 色彩调整 2 4.1.2. 变形和扭曲 5 5. JJIL 是一个Java 的图像处理类库,有超过60

基于SVM的字母验证码识别

基于SVM的字母验证码识别 摘要 本文研究的问题是包含数字和字母的字符验证码的识别.我们采用的是传统的字符分割识别方法,首先将图像中的字符分割出来,然后再对单字符进行识别.首先通过图像的初步去噪.滤波.形态学操作等一系列预处理过程,我们能够将图像中的噪点去除掉.为了将字符分割开来,我们利用Kmeans聚类算法对图像中的像素点聚成五类,分别代表五个字符,结果表明Kmeans算法的聚类准确度能够达到99.2%.对字符分割完成之后,我们采用支持向量机的算法对字符进行识别,通过调节参数能够使得准确率达到

验证码识别 Tesseract的简单使用和总结

Tesseract是什么 OCR即光学字符识别,是指通过电子设备扫描纸上的打印的字符,然后翻译成计算机文字的过程.也就是说通过输入图片,经过识别引擎,去识别图片上的文字.Tesseract是一种适用于各种操作系统的光学字符识别引擎,最早是hp公司的软件,2005年开源,2006年后由google一直赞助Tesseract开发和维护.2006年,Tesseract被认为是当时最准确的开源OCR引擎之一 . 验证码识别类型 这里讨论一般的验证码识别,即英文.数字.或者英文和数字的混合的验证码,不包括

基于python语言的tensorflow的‘端到端’的字符型验证码识别源码整理(github源码分享)

基于python语言的tensorflow的‘端到端’的字符型验证码识别 1   Abstract 验证码(CAPTCHA)的诞生本身是为了自动区分 自然人 和 机器人 的一套公开方法, 但是近几年的人工智能技术的发展,传统的字符验证已经形同虚设. 所以,大家一方面研究和学习此代码时,另外一方面也要警惕自己的互联网系统的web安全问题. Keywords: 人工智能,Python,字符验证码,CAPTCHA,识别,tensorflow,CNN,深度学习 2   Introduction 全自动区