JAVA用tess4j识别复杂的验证码,自定义字库,计算题验证码,jTessBoxEditor,tess4j,验证码识别

这篇具有很好参考价值的文章主要介绍了JAVA用tess4j识别复杂的验证码,自定义字库,计算题验证码,jTessBoxEditor,tess4j,验证码识别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

场景

在爬虫爬取数据的过程中可能会遇到各种验证码,导致爬虫无法继续。本文讲解如果在java中如何使用tess4j识别图片中的文本、自定义模型。

JAVA用tess4j识别文本

MAVEN依赖

<dependency>
    <groupId>net.sourceforge.tess4j</groupId>
    <artifactId>tess4j</artifactId>
    <version>5.6.0</version>
</dependency>

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.15</version>
</dependency>

等下需要用到脚本引擎计算表达式

traineddata文件下载

github下载地址:https://github.com/tesseract-ocr/tessdata

常用的语言及其traineddata文件对照表

语言 文件
简体中文 chi_sim.traineddata
English eng.traineddata

识别英文

代码

package com.beiyoufamily;

import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;

import java.io.File;

/**
 * @author Yi Dai 484201132@qq.com
 * @since 2023/6/3 15:25
 */

public class EnglishIdentification {

    public static void main(String[] args) throws TesseractException {
        //要是别的验证码图片
        File captchaImageFile = new File("C:/Files/images/captcha/test/English.png");
        //创建tesseract对象
        Tesseract tesseract = new Tesseract();
        //设置traineddata文件目录
        tesseract.setDatapath("C:/Files/images/captcha/traineddata");
        //设置语言(不需要写扩展名)
        tesseract.setLanguage("eng");
        String result = tesseract.doOCR(captchaImageFile);
        System.out.println(result);
    }

}

运行结果:java识别验证码,java,tess4j,jTessBoxEditor,验证码识别,计算题验证码识别

标准的英文字符识别率非常高

识别中文

代码

package com.beiyoufamily;

import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;

import java.io.File;

/**
 * @author Yi Dai 484201132@qq.com
 * @since 2023/6/3 15:25
 */

public class ChineseIdentification {

    public static void main(String[] args) throws TesseractException {
        //要是别的验证码图片
        File captchaImageFile = new File("C:/Files/images/captcha/test/Chinese.png");
        //创建tesseract对象
        Tesseract tesseract = new Tesseract();
        //设置traineddata文件目录
        tesseract.setDatapath("C:/Files/images/captcha/traineddata");
        //设置语言(不需要写扩展名)
        tesseract.setLanguage("chi_sim");
        String result = tesseract.doOCR(captchaImageFile);
        System.out.println(result);
    }

}

运行结果

看了一下识别结果,不能说不太准确,只能说是非常糟糕。总所周知tess4j除了对中文不太友好以外,其他语言都挺准确的。

JAVA用tess4j识别验证码

常见验证码的类型

  • 数字类型
    java识别验证码,java,tess4j,jTessBoxEditor,验证码识别,计算题验证码识别

  • 滑块验证码
    java识别验证码,java,tess4j,jTessBoxEditor,验证码识别,计算题验证码识别

  • 计算题
    java识别验证码,java,tess4j,jTessBoxEditor,验证码识别,计算题验证码识别

识别

上述验证码中,第一种数字类型的比较简单,只需要对图像做二值化之后进行识别,准确率还是很高的,第二种滑块的验证码比较恶心,今天暂时不讨论它;今天讨论的是第三种,计算题验证码(方法同样适用于第一种验证码)。

代码

package com.beiyoufamily;

import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;

import java.io.File;

/**
 * @author Yi Dai 484201132@qq.com
 * @since 2023/6/3 15:09
 */

public class CaptchaIdentification {

    public static void main(String[] args) throws TesseractException {
        //要是别的验证码图片
        File captchaImageFile = new File("C:/Files/images/captcha/test/captcha.png");
        //创建tesseract对象
        Tesseract tesseract = new Tesseract();
        //设置traineddata文件目录
        tesseract.setDatapath("C:/Files/images/captcha/traineddata");
        //设置语言(不需要写扩展名)
        tesseract.setLanguage("eng");
        String result = tesseract.doOCR(captchaImageFile);
        System.out.println(result);
    }


}

运行结果
java识别验证码,java,tess4j,jTessBoxEditor,验证码识别,计算题验证码识别
很尴尬,除了两个数字被正确识别之外,符号一个没识别出来,换成中文识别率更低,有兴趣的小伙伴可以试试其他语言。很显然这不是我们想要的效果,所以引出今天的重点——自定义字库

自定义字库,提高识别率

下载jTessBoxEditor

官网下载:https://udomain.dl.sourceforge.net/project/vietocr/jTessBoxEditor/jTessBoxEditor-2.4.1.zip

解压

java识别验证码,java,tess4j,jTessBoxEditor,验证码识别,计算题验证码识别

添加环境变量

java识别验证码,java,tess4j,jTessBoxEditor,验证码识别,计算题验证码识别
操作步骤:右键此电脑-属性-高级系统设置-环境变量-Path-添加-输入JTessBoxEditor的tesseract-ocr目录

运行

双击jTessBoxEditor.jar运行
java识别验证码,java,tess4j,jTessBoxEditor,验证码识别,计算题验证码识别
java识别验证码,java,tess4j,jTessBoxEditor,验证码识别,计算题验证码识别

准备素材

素材当然是越多越好,这样训练出来之后识别率会更高
java识别验证码,java,tess4j,jTessBoxEditor,验证码识别,计算题验证码识别

合并PNG为tif文件

依次点击Tools - Merge TIFF...
java识别验证码,java,tess4j,jTessBoxEditor,验证码识别,计算题验证码识别
文件类型选为png(根据实际类型选择),不然看不到你的文件,全选素材,然后点击打开
java识别验证码,java,tess4j,jTessBoxEditor,验证码识别,计算题验证码识别

注意!!! 这一步的文件名是有讲究的,不能随意命名!

java识别验证码,java,tess4j,jTessBoxEditor,验证码识别,计算题验证码识别
tif文件命名格式需规范,格式为[lang].[fontname].exp[num].tif,lang为语言名称,fontname为字体名称,num为序号。例如上图所示的:verification-code.calculation-question.exp0.tif(扩展名可以自动加,只要文件类型选对的)

java识别验证码,java,tess4j,jTessBoxEditor,验证码识别,计算题验证码识别
点击确定,即可合并完成

生成box文件

在刚才tif文件生成的目录执行命令:

tesseract verification-code.calculation-question.exp0.tif verification-code.calculation-question.exp0 batch.nochop makebox

执行结果:
java识别验证码,java,tess4j,jTessBoxEditor,验证码识别,计算题验证码识别

使用jTessBoxEditor工具对tif文件进行校准

依次点击Box Editor - Open 然后选择刚才生成的tif文件,选择之后他会自动关联上对应的box文件
java识别验证码,java,tess4j,jTessBoxEditor,验证码识别,计算题验证码识别
java识别验证码,java,tess4j,jTessBoxEditor,验证码识别,计算题验证码识别

校正

java识别验证码,java,tess4j,jTessBoxEditor,验证码识别,计算题验证码识别
示例:
java识别验证码,java,tess4j,jTessBoxEditor,验证码识别,计算题验证码识别
java识别验证码,java,tess4j,jTessBoxEditor,验证码识别,计算题验证码识别
以此类推,把后面的字符和位置全部校正,这个过程有点枯燥

生成tr文件

在刚刚的tif文件所在目录执行命令:

tesseract verification-code.calculation-question.exp0.tif verification-code.calculation-question.exp0 nobatch box.train

执行结果:
java识别验证码,java,tess4j,jTessBoxEditor,验证码识别,计算题验证码识别

生成生成字符集文件unicharset文件

同样的目录中执行命令:

unicharset_extractor verification-code.calculation-question.exp0.box

执行结果:
java识别验证码,java,tess4j,jTessBoxEditor,验证码识别,计算题验证码识别

生成font_properties文件(不需要扩展名,切记;calculation-question为font)

执行命令:

echo calculation-question 0 0 0 0 0 > font_properties

执行结果:
java识别验证码,java,tess4j,jTessBoxEditor,验证码识别,计算题验证码识别

生成shape文件

执行命令:

shapeclustering -F font_properties -U unicharset -O verification-code.unicharset verification-code.calculation-question.exp0.tr

执行结果:
java识别验证码,java,tess4j,jTessBoxEditor,验证码识别,计算题验证码识别

生成聚字符特征文件

执行命令:

mftraining -F font_properties -U unicharset -O unicharset verification-code.calculation-question.exp0.tr

执行结果:
java识别验证码,java,tess4j,jTessBoxEditor,验证码识别,计算题验证码识别

生成字符正常化特征文件

执行命令:

cntraining verification-code.calculation-question.exp0.tr

执行结果:
java识别验证码,java,tess4j,jTessBoxEditor,验证码识别,计算题验证码识别

把inttemp、pffmtable、shapetable、normproto四个文件命名为[lang].xxx

分别执行下面四个重命名命令:

rename normproto verification-code.normproto

rename inttemp verification-code.inttemp

rename pffmtable verification-code.pffmtable

rename shapetable verification-code.shapetable

执行结果:
java识别验证码,java,tess4j,jTessBoxEditor,验证码识别,计算题验证码识别

合并训练文件成成traineddata文件

执行命令:

combine_tessdata verification-code

执行结果:
java识别验证码,java,tess4j,jTessBoxEditor,验证码识别,计算题验证码识别
自此,训练完成!

使用自定义的字库进行识别

代码:(verification-code为刚才训练所得的)

package com.beiyoufamily;

import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;

import java.io.File;

/**
 * @author Yi Dai 484201132@qq.com
 * @since 2023/6/3 15:09
 */

public class CaptchaIdentification {

    public static void main(String[] args) throws TesseractException {
        //要是别的验证码图片
        File captchaImageFile = new File("C:/Files/images/captcha/test/captcha.png");
        //创建tesseract对象
        Tesseract tesseract = new Tesseract();
        //设置traineddata文件目录
        tesseract.setDatapath("C:/Files/images/captcha/traineddata");
        //设置语言(不需要写扩展名)
        tesseract.setLanguage("verification-code");
        String result = tesseract.doOCR(captchaImageFile);
        System.out.println(result);
    }


}

运行结果:
java识别验证码,java,tess4j,jTessBoxEditor,验证码识别,计算题验证码识别
非常完美,精确的识别出了表达式!

用脚本引擎识别计算出结果

package com.beiyoufamily;

import cn.hutool.script.ScriptUtil;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;

import java.io.File;
import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author Yi Dai 484201132@qq.com
 * @since 2023/6/3 15:09
 */

public class CaptchaIdentification {

    public static void main(String[] args) throws TesseractException {
        //要是别的验证码图片
        File captchaImageFile = new File("C:/Files/images/captcha/test/captcha.png");
        //创建tesseract对象
        Tesseract tesseract = new Tesseract();
        //设置traineddata文件目录
        tesseract.setDatapath("C:/Files/images/captcha/traineddata");
        //设置语言(不需要写扩展名)
        tesseract.setLanguage("verification-code");
        String result = tesseract.doOCR(captchaImageFile);

        if (Objects.nonNull(result)) {
            //去除所有的空白字符
            result = result.replaceAll("\\s*", "").trim();

            String pattern = "\\d+[+\\-*/]\\d+=\\?";
            
            //判断识别出来的表达式是否合法
            if (Pattern.matches(pattern, result)) {
                //提取表达式
                Matcher matcher = Pattern.compile("\\d+[+\\-*/]\\d+").matcher(result);
                if (matcher.find()) {
                    String expression = matcher.group();
                    System.out.println(expression);
                    System.out.println(ScriptUtil.eval(expression));
                }
            }
        }
    }
}

计算结果:
java识别验证码,java,tess4j,jTessBoxEditor,验证码识别,计算题验证码识别

其他注意事项

本演示示例是在Java8环境中运行的,高版本的Java环境可能会没有脚本引擎,会报错。

训练的过程中由于命令众多,参数复杂,博主封装了一个小工具,可以直接运行,省去输入命令,下载地址:
https://download.csdn.net/download/daiyi666/87888642传送门

下载之后直接点击run.bat运行即可,根据提示操作。文章来源地址https://www.toymoban.com/news/detail-731636.html

到了这里,关于JAVA用tess4j识别复杂的验证码,自定义字库,计算题验证码,jTessBoxEditor,tess4j,验证码识别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java识别图片验证码

    之前在进行selenium自动化测试时需要对项目内的验证码进行识别,通常有三种方法进行验证码处理: 去除验证码 万能验证码 自动识别 但由于部分数据未提供了api,我们只能通过自动识别方式去进行“破解” 鄙人使用两种开源技术进行尝试:tess4j和tesseract-ocr(OCR) 1.下载tessd

    2024年02月06日
    浏览(41)
  • Java实现AWS S3 V4 Authorization自定义验证

    最近在开发文件存储服务,需要符合s3的协议标准,可以直接接入aws-sdk,本文针对sdk发出请求的鉴权信息进行重新组合再签名验证有效性,sdk版本如下 首先对V4版本签名算法的数据结构及签名流程进行拆解分析,以请求头签名为示例讲解 signature = doSign(waitSignString) waitSignStri

    2024年02月07日
    浏览(45)
  • 图数据库Neo4j——SpringBoot使用Neo4j & 简单增删改查 & 复杂查询初步

    图形数据库是专门用于存储图形数据的数据库,它使用图形模型来存储数据,并且支持复杂的图形查询。常见的图形数据库有Neo4j、OrientDB等。 Neo4j是用Java实现的开源NoSQL图数据库,本篇博客介绍如何在SpringBoot中使用Neo4j图数据库,如何进行简单的增删改查,以及如何进行复杂

    2024年02月06日
    浏览(63)
  • java对接打码平台用selenium实现对图片验证码识别(对接文档看这一个就够了)

    在很多平台软件中,咱们登录之后都有一些验证,例如图片数字验证,还有现在流行的滑块验证码,点选验证码,这么复杂的事情,我们程序员当然要用程序的方式解决啦,所以也有一些平台提供了快捷验证的方式,在这里,博主就给大家分享一下,如何实现对图片数字的识

    2023年04月25日
    浏览(71)
  • 图形数据库的实战应用:如何在 Neo4j 中有效管理复杂关系

    关系数据库管理系统( RDBMS ) 代表了最先进的技术,这在一定程度上要归功于其由周边技术、工具和广泛的专业技能组成的完善的生态系统。 在这个涵盖信息技术(IT) 和运营技术(OT) 的技术革命时代,人们普遍认识到性能方面出现了重大挑战,特别是在NoSQL 解决方案优于传统方

    2024年02月03日
    浏览(57)
  • element-ui实现密码复杂度验证

    1、el-form中的rules属性,rules属性定义的是存放多个验证规则的数组formRules(这个数组是个人起的名字),el-form-item中的prop属性,对应的是formRules数组中的对应的规则名称,然后在el-input标签内,设置一个v-model双向数据绑定,以及其他的属性等。:model是绑定属性,置空 在规则

    2024年02月07日
    浏览(40)
  • log4j2漏洞CVE-2021-44228复现笔记(纯步骤过程,没有复杂的知识点)

    前言: Apache Log4j 2 是对 Log4j 的升级,它比其前身 Log4j 1.x 提供了显着改进,并提供了 Logback 中可用的许多改进,同时修复了 Logback 架构中的一些固有问题。 2021 年 12 月,在 Apache Log4j2 中发现了一个 0-day 漏洞。Log4j 的 JNDI 支持并没有限制可以解析的名称。一些协议像rmi:和ld

    2024年02月12日
    浏览(46)
  • springboot整合Knife4j--token头验证

    Knife4j其实就是增强版本的swagger,过多的介绍我就不说了,一搜一大把,直接开始吧哈哈 1.引入pom依赖 需要其他版本的可以去https://mvnrepository.com/  自己选择。 2.配置类 链式调用时api指定需要扫描的包,如果在配置加入@ConditionalOnProperty注解可以在yml文件配置用户名密码等等,

    2023年04月08日
    浏览(38)
  • TDesign表单rules通过函数 实现复杂逻辑验证输入内容

    Element ui 中 我们可以通过validator 绑定函数来验证一些不在表单model中的值 又或者处理一下比较复杂的判断逻辑 TDesign也有validator 但比较直观的说 没有Element那么好用 这里 我们给validator绑定了我们自己的checkAge函数 这个函数中 只有一个参数 value 而且 如果你的v-model绑定的值不

    2024年02月10日
    浏览(44)
  • 前端开发必备:掌握正则表达式,轻松应对复杂的表单验证

    在前端开发中,经常需要处理 URL 地址、校验手机号合法性、提取域名等。正则表达式是一种常用的工具。通过使用正则表达式,我们可以对用户输入进行有效的验证,确保数据的合法性和完整性。本文将介绍一些常见的正则表达式,帮助你在开发中处理匹配的关键信息。

    2024年01月19日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包