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

news2024/11/16 6:30:17

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

  • 场景
  • JAVA用tess4j识别文本
    • MAVEN依赖
    • traineddata文件下载
    • 识别英文
    • 识别中文
  • JAVA用tess4j识别验证码
    • 常见验证码的类型
    • 识别
  • 自定义字库,提高识别率
    • 下载jTessBoxEditor
    • 解压
    • 运行
    • 准备素材
    • 合并PNG为tif文件
    • 生成box文件
    • 使用jTessBoxEditor工具对tif文件进行校准
    • 校正
    • 生成tr文件
    • 生成生成字符集文件unicharset文件
    • 生成font_properties文件(不需要扩展名,切记)
    • 生成shape文件
    • 生成聚字符特征文件
    • 生成字符正常化特征文件
    • 把inttemp、pffmtable、shapetable、normproto四个文件命名为`[lang].xxx`
    • 合并训练文件成成traineddata文件
  • 使用自定义的字库进行识别
    • 用脚本引擎识别计算出结果
  • 其他注意事项

场景

在爬虫爬取数据的过程中可能会遇到各种验证码,导致爬虫无法继续。本文讲解如果在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
Englisheng.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);
    }

}

运行结果:在这里插入图片描述

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

识别中文

代码

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识别验证码

常见验证码的类型

  • 数字类型
    在这里插入图片描述

  • 滑块验证码
    在这里插入图片描述

  • 计算题
    请添加图片描述

识别

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

代码

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);
    }


}

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

自定义字库,提高识别率

下载jTessBoxEditor

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

解压

在这里插入图片描述

运行

双击jTessBoxEditor.jar运行
在这里插入图片描述
在这里插入图片描述

准备素材

素材当然是越多越好,这样训练出来之后识别率会更高
在这里插入图片描述

合并PNG为tif文件

依次点击Tools - Merge TIFF...
在这里插入图片描述
文件类型选为png(根据实际类型选择),不然看不到你的文件,全选素材,然后点击打开
在这里插入图片描述

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

在这里插入图片描述
tif文件命名格式需规范,格式为[lang].[fontname].exp[num].tif,lang为语言名称,fontname为字体名称,num为序号。例如上图所示的:verification-code.calculation-question.exp0.tif(扩展名可以自动加,只要文件类型选对的)

在这里插入图片描述
点击确定,即可合并完成

生成box文件

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

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

执行结果:
在这里插入图片描述

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

依次点击Box Editor - Open 然后选择刚才生成的tif文件,选择之后他会自动关联上对应的box文件
在这里插入图片描述
在这里插入图片描述

校正

在这里插入图片描述
示例:
在这里插入图片描述
在这里插入图片描述
以此类推,把后面的字符和位置全部校正,这个过程有点枯燥

生成tr文件

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

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

执行结果:
在这里插入图片描述

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

同样的目录中执行命令:

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

执行结果:
在这里插入图片描述

生成font_properties文件(不需要扩展名,切记)

执行命令:

echo normal 0 0 0 0 0 > font_properties

执行结果:
在这里插入图片描述

生成shape文件

执行命令:

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

执行结果:
在这里插入图片描述

生成聚字符特征文件

执行命令:

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

执行结果:
在这里插入图片描述

生成字符正常化特征文件

执行命令:

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

执行结果:
在这里插入图片描述

把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

执行结果:
在这里插入图片描述

合并训练文件成成traineddata文件

执行命令:

combine_tessdata verification-code

执行结果:
在这里插入图片描述
自此,训练完成!

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

代码:(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);
    }


}

运行结果:
在这里插入图片描述
非常完美,精确的识别出了表达式!

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

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));
                }
            }
        }
    }
}

计算结果:
在这里插入图片描述

其他注意事项

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/605384.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序入门笔记

常用技术&#xff1a;开源库 图表&#xff1a;wxcharts-min.js 网络通信&#xff1a;类似 ajax ui: WeUi JSON 配置文件 小程序中&#xff0c;包含唯一的全局配置文件 app.json&#xff0c;以及每个页面的配置文件 page.json。每单页页面相应的 JSON 文件会覆盖与 app.json相同…

门控时钟检查(clock gating check)的理解和设计应用(上)

在笔者的一篇老文Clock Gating之浅见 中&#xff0c;一起探讨过工具处理门控时钟的方法和门控时钟所带来的相关收益和面积代价。除此之外&#xff0c;门控时钟的检查&#xff08;clock-gating check&#xff09;在STA中也有相应的处理方式&#xff0c;通过这篇文章&#xff0c;…

4年测试经验,一问三不知,过于离谱...

公司今年要招人&#xff0c;面倒是面了很多测试&#xff0c;但没有一个合适的。一开始想要的就是中级的水准&#xff0c;也没指望来大牛&#xff0c;当然来了更好&#xff0c;提供的薪资在10-20k,来面试的人有很多&#xff0c;但平均水准真的是让人失望。 看简历时很多都写着3…

【瑞萨MCU】玩转 HMI-Board 之 MDK + RASC 点灯

此前我们已经配置好了 瑞萨 MCU MDK RASC 的开发环境&#xff0c;接下来进入到瑞萨 MCU 的 HelloWorld 环节&#xff0c;使用 MDK 点亮两个 LED 灯。 这次我们使用的是瑞萨和 RT-Thread 联合推出的 HMI-Board 开发板。 HMI-Board 开发板简介 HMI-Board 为 RT-Thread 联合瑞…

3.6 多边形游戏

博主简介&#xff1a;一个爱打游戏的计算机专业学生博主主页&#xff1a; 夏驰和徐策所属专栏&#xff1a;算法设计与分析 1.什么是多边形游戏&#xff1f; 对于多边形游戏&#xff0c;一种特定类型的玩法&#xff0c;即在给定的简单多边形上进行移动、删除顶点或边&#xff…

[图表]pyecharts-3D柱状图

[图表]pyecharts-3D柱状图 先来看代码&#xff1a; import randomfrom pyecharts import options as opts from pyecharts.charts import Bar3D from pyecharts.faker import Fakerdata [(i, j, random.randint(0, 12)) for i in range(6) for j in range(24)] c (Bar3D().…

box-shadow盒子阴影几种用法

box-shadow盒子阴影 语法&#xff1a; 外阴影&#xff1a;box-shadow: X轴 Y轴 Rpx color; 属性说明&#xff08;顺序依次对应&#xff09;&#xff1a; 阴影的X轴(可以使用负值) 阴影的Y轴(可以使用负值) 阴影模糊值&#xff08;大小&#xff09; 阴影的颜色 内阴…

【Linux】LAMP框架的架构与环境配置

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 LAMP框架的架构与环境配置 一、LAMP架构的相关知识1.LAMP组件的主要作用2.LAMP组件安装顺序 二、编译安装Apache httpd服务1.关闭防火墙&#xff0c;将所需软件包传到/opt目录…

00后简直太卷了,让我们这些老油条情何以堪......

前几天我们公司一下子也来了几个新人&#xff0c;这些年前人是真能熬啊&#xff0c;本来我们几个老油子都是每天稍微加会班就打算走了&#xff0c;这几个新人一直不走&#xff0c;搞得我们也不好走。 2023年春招结束了&#xff0c;最近内卷严重&#xff0c;各种跳槽裁员&#x…

ARM-LED灯--蜂鸣器

目录 点亮LED灯 1.开发板介绍 2.cpu控制硬件原理 3.本地开发和交叉开发 4.点灯实验 分析电路图 底板原理图&#xff1a;1&#xff09;电路原理图&#xff0c;LED的控制方式->高电平亮&#xff0c;低电平灭 核心板原理图&#xff1a;2&#xff09;LED与SOC的连接关系-&…

Vue+node.js校园食堂餐厅外卖点餐系统088e4

外卖点餐系统的主要使用者分为管理员和用户&#xff0c;实现功能包括用户管理、菜品分类管理、菜品信息管理、系统管理、订单管理等功能。由于本网站的功能模块设计比较全面&#xff0c;所以使得整个外卖点餐信息管理的过程得以实现。 本外卖点餐系统主要包括二大功能模块&…

Dynamic Connected Networks for Chinese Spelling Check ---- 论文阅读

DCN 动机简介方法动态连接评分器候选生成拼音增强候选生成器 训练损失函数预训练 预测 实验数据集方法比较 消融 Paper&#xff1a;https://aclanthology.org/2021.findings-acl.216.pdf Code&#xff1a;https://github.com/destwang/DCN [Pytorch] 哈工大讯飞 动机 大多数关…

【Linux】Apache 配置与应用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、构建虚拟 Web 主机1.httpd服务支持的虚拟主机类型 二、基于域名的虚拟主机1.为虚拟主机提供域名解析2.为虚拟主机准备网页文档3.添加虚拟主机配置4.设置访问控制…

FreeRTOS进阶学习

一、FreeRTOS内核控制控制函数&#xff1a; 1、请求任务切换函数&#xff1a; 函数原型&#xff1a;#define taskYIELD() 函数解析&#xff1a;实际上是一个宏定义的函数&#xff0c;调用一次会触发pendSV中断来实现任务切换&#xff1b; /// 2、在任务中进入临界区函数&…

LLM:大模型的正则化

主流大模型使用的Normalization主要有三类&#xff0c;分别是Layer Norm&#xff0c;RMS Norm&#xff0c;以及Deep Norm。 小模型的正则化参考&#xff1a; l1l2正则和dropout正则化[https://youzipi.blog.csdn.net/article/details/75307522] LN和BN归一化 [深度学习&…

【3000字帮你深度剖析数据在内存中的存储】

本节重点 -- 重中之重 数据类型详细介绍 整形在内存中的存储&#xff1a;原码、反码、补码 大小端字节序介绍及判断 浮点型在内存中的存储解析 准备好了&#xff0c;开始啰&#xff0c;在小小的花园里面......最近被这个歌曲洗脑&#xff0c;但是我们并不是要唱歌&#xff0c;而…

linux基础知识学习记录

这里写自定义目录标题 一、 计算机基础知识二 、 Linux操作系统的介绍三、 Linux的安装四、Linux命令使用汇总 一、 计算机基础知识 计算机组成&#xff1a;计算机主要硬件和软件2部分组成。计算机软硬件的概念&#xff1a;硬件是可以看得见的物理实体&#xff0c;软件是运行在…

还在担心期末挂科吗? 期末必备复习资料-----“树“的概念

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f349;本篇简介:>:记录期末复习 数据结构中有关树的一些知识 金句分享: ✨我将…

2023最新150道渗透测试面试题

前言 眨眼间2023年快过去一半了&#xff0c;不知道大家有没有找到心仪的工作呀&#xff0c;今天我给大家整理了150道渗透测试面试题给大家&#xff0c;需要答案的话可以在评论区给我留言哦~ 第一套渗透测试面试题 你了解什么是网络安全渗透测试吗&#xff1f; 你的网络安全渗…

Stream相关知识点

这里写目录标题 Stream流体验Stream流Stream流的常见生成方式流程分类具体操作 Stream流常见中间操作之filter简介具体操作 Stream流常见中间操作之limit&skip简介具体操作 Stream流常见中间操作之concat&distinct简介具体操作 Stream流常见中间操作之concat&disti…