AI工具【OCR 01】Java可使用的OCR工具Tess4J使用举例(身份证信息识别核心代码及信息提取方法分享)

Java可使用的OCR工具Tess4J使用举例

  • 1.简介
    • 1.1 简单介绍
    • 1.2 官方说明
  • 2.使用举例
    • 2.1 依赖及语言数据包
    • 2.2 核心代码
    • 2.3 识别身份证信息
      • 2.3.1 核心代码
      • 2.3.2 截取指定字符
      • 2.3.3 去掉字符串里的非中文字符
      • 2.3.4 提取出生日期(待优化)
      • 2.3.5 实测
  • 3.总结

1.简介

1.1 简单介绍

Lept4J和Tess4J都是基于Tesseract OCR引擎的Java接口,可以用来识别图像中的文本:

  • 前者是Leptonica图像处理库的Java封装,提供了图像的加载、处理、分析等功能。
  • 后者是Tesseract OCR引擎的Java封装,提供了图像的OCR识别、PDF文档的生成等功能。

Lept4J和Tess4J的区别在于,Lept4J主要负责图像的预处理,而Tess4J主要负责图像的后处理,特点分别是:

  • Lept4J支持多种图像格式,可以进行图像的缩放、旋转、裁剪、二值化、降噪等操作,提高图像的质量和识别率。
  • Tess4J支持多种语言的识别,可以生成文本、HTML、PDF等格式的输出,提供了多种识别模式和参数设置,满足不同的需求。

根据具体场景和需求,可以选择使用Lept4J或Tess4J,或者结合使用两者,以达到最佳的效果。

1.2 官方说明

官网:https://tess4j.sourceforge.net/
描述:A Java JNA wrapper for Tesseract OCR API.Tess4J is released and distributed under the Apache License, v2.0 and is also available from Maven Central Repository.
特性:The library provides optical character recognition (OCR) support for:

  • TIFF, JPEG, GIF, PNG, and BMP image formats
  • Multi-page TIFF images
  • PDF document format

2.使用举例

2.1 依赖及语言数据包

<!-- https://mvnrepository.com/artifact/net.sourceforge.tess4j/tess4j -->
<dependency><groupId>net.sourceforge.tess4j</groupId><artifactId>tess4j</artifactId><version>5.9.0</version>
</dependency>

语言数据包下载地址:https://github.com/tesseract-ocr/tessdata
LanguageData.jpg

2.2 核心代码

    /*** 识别图片字符信息** @param imagePath 图片路径*/private static String recognitionString(String imagePath) {File imageFile = new File(imagePath);ITesseract instance = new Tesseract();// 1.语言数据包路径instance.setDatapath("tessdata");// 2.加载语言文件名称instance.setLanguage("chi_sim");String result = "";try {result = instance.doOCR(imageFile);} catch (TesseractException e) {e.printStackTrace();}return result;}

2.3 识别身份证信息

2.3.1 核心代码

    /*** 识别身份证信息** @param imagePath 图片路径*/private static Map<String, Object> recognitionIdentityCardInfo(String imagePath) {Map<String, Object> res = new HashMap<>(2);// 识别图片File imageFile = new File(imagePath);BufferedImage bufferedImage = null;try {bufferedImage = ImageIO.read(imageFile);} catch (IOException e) {e.printStackTrace();}ITesseract instance = new Tesseract();instance.setDatapath("tessdata");instance.setLanguage("chi_sim");List<Word> words = instance.getWords(bufferedImage, 1);// 获取姓名int nameLineIndex = 0;if (words.size() > nameLineIndex) {res.put("name", getStringByIndex(words.get(0).getText(), 2));}// 获取性别和民族int genderAndNationLineIndex = 1;if (words.size() > genderAndNationLineIndex) {res.put("gender", getStringByIndex(words.get(1).getText(), 2, 1));res.put("nation", removeNonChinese(getStringByIndex(words.get(1).getText(), 5, -1)));}// 获取出生日期int birthLineIndex = 2;if (words.size() > birthLineIndex) {res.put("birth", extractBirthDate(getStringByIndex(words.get(2).getText(), 2)));}// 获取住址int addressLineIndex = 3;if (words.size() > addressLineIndex) {res.put("address", getStringByIndex(words.get(3).getText(), 2).replace("/", ""));}// 获取身份证号码int noLineIndex = 4;if (words.size() > noLineIndex) {res.put("no", getStringByIndex(words.get(4).getText(), 7));}return res;}

2.3.2 截取指定字符

    /*** 截取指定字符** @param inputString 字符串* @param indexStart  开始Index* @return 截取的字符串*/private static String getStringByIndex(String inputString, int indexStart) {return getStringByIndex(inputString, indexStart, -1);}/*** 截取指定字符** @param inputString 字符串* @param indexStart  开始Index* @param size        截取的字符个数* @return 截取的字符串*/private static String getStringByIndex(String inputString, int indexStart, int size) {// 去除字符串两端的空白字符String trimmedString = inputString.trim();// 将字符串以空白字符分割StringBuilder res = new StringBuilder();String[] words = trimmedString.split("\\s+");int length = words.length;int contentSize = indexStart + size;if (length > indexStart) {int index = length;if (size > 0 && length > contentSize) {index = contentSize;}for (int i = indexStart; i < index; i++) {res.append(words[i]);}}return res.toString();}

2.3.3 去掉字符串里的非中文字符

    /*** 去掉字符串里的非中文字符** @param inputString 字符串* @return 中文字符串*/private static String removeNonChinese(String inputString) {// 匹配非汉字字符的正则表达式String regex = "[^\u4E00-\u9FA5]";Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(inputString);// 替换非汉字字符为空格return matcher.replaceAll("");}

2.3.4 提取出生日期(待优化)

    /*** 提取出生日期** @param inputString 字符串* @return 出生日期*/private static String extractBirthDate(String inputString) {// 匹配日期格式的正则表达式String regex = "(\\d{4}年\\d{2}月\\d{2}日)";Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(inputString);// 提取匹配到的日期if (matcher.find()) {return matcher.group(1);} else {return "未找到日期";}}

2.3.5 实测

图片:
ID.jpg
结果:

{name=代用名, gender=, nation=, birth=20130506, address=湖南省长沙市开福区送道街仪幸福小区居民组, no=30512198908131367}
  • 姓名 正确
  • 性别 正确
  • 民族 正确
  • 出生 正确
  • 住址 错了一个字(巡)多了一个字(仪)
  • 公民身份证号码 缺少首位(4)

3.总结

  • Java能用挺友好
  • 缺点是识别率有点儿低

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

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

相关文章

Unity SRP 管线【第九讲:URP 点光源与聚光灯】

文章目录 CPU数据搜集GPU数据使用光照计算 CPU数据搜集 我们只能支持有限数量的其他灯。并将这些灯光数据&#xff08;位置、颜色、阴影强度、方向光光源、灯光遮蔽Probe、灯光层级Mask&#xff09;发送到GPU以供场景中所有物体渲染使用。 //ForwardLights.cs 额外光源数量与…

字符串string详细使用(计算机考研复试上机知识点)

字符串去重&#xff1a; 字符串去重 #include <bits/stdc.h> using namespace std;int main() { a"11322";sort(a.begin(),a.end());a.erase(unique(a.begin(),a.end()),a.end());cout<<a<<endl;return 0; } //unique函数返回没有重复区间的区间…

uniform initialization(一致化初始化)

目录 std::initializer_list 和 std::array std::initializer_list 的作用&#xff1a; std::array 的作用&#xff1a; std::initializer_list 和 std::array 使用联系 标准库里面的initializer_list 使用 vector std::initializer_list 和 std::array std::initializer_…

RabbitMQ实战指南(二)—— 基本概念

RabbitMQ实战指南&#xff08;二&#xff09;—— 基本概念 RabbitMQ是一个开源的消息中间件&#xff0c;用于在应用程序之间进行可靠的消息传递。它遵循AMQP&#xff08;高级消息队列协议&#xff09;标准&#xff0c;支持多种编程语言和平台。 下面是RabbitMQ的基本概念&…

qt内存自动释放的两种情况

qt内存管理机制 QObject的parent 我们时常能看到QWidget或者其他的控件的构造函数中有一项参数parent&#xff0c;默认值都为NULL&#xff0c;例如&#xff1a; QLineEdit(const QString &contents, QWidget *parent nullptr); QWidget(QWidget *parent nullptr, Qt::…

vue3学习——初始化项目及配置

初始化项目 环境 node 16pnpm 8.0.0 命令 pnpm create vite进行以下选择 &#x1f447; – 项目名 – VUe – Ts – cd/目录 – pnpm run dev 浏览器自动打开 package.json 配置eslint 安装依赖包 pnpm i eslint -D npx eslint --init // 生成配置文件进行以下选择 &a…

【2024】大三寒假再回首:缺乏自我意识是毒药,反思和回顾是解药

2024年初&#xff0c;学习状态回顾 开稿时间&#xff1a;2024-1-23 归家百里去&#xff0c;飘雪送客迟。 搁笔日又久&#xff0c;一顾迷惘时。 我们饱含着过去的习惯&#xff0c;缺乏自我意识是毒药&#xff0c;反思和回顾是解药。 文章目录 2024年初&#xff0c;学习状态回顾一…

vue——实现多行粘贴到table事件——技能提升

最近在写后台管理系统时&#xff0c;遇到一个需求&#xff0c;就是要从excel表格中复制多行内容&#xff0c;然后粘贴到后台系统中的table表格中。 如下图所示&#xff1a;一次性复制三行内容&#xff0c;光标放在红框中的第一个框中&#xff0c;然后按ctrlv粘贴事件&#xff0…

掌上医院预约挂号缴费系统源码,与医院信息系统共享数据,实现在线预约挂号、移动支付、医保支付、检验检查报告查看、门诊病历查询等功能。

随着信息技术的发展和互联网的普及&#xff0c;越来越多的患者开始习惯于通过互联网获取医疗服务。网上预约挂号是近年来开展的一项便民就医服务&#xff0c;旨在缓解看病难、挂号难的就医难题&#xff0c;许多患者为看一次病要跑很多次医院&#xff0c;最终还不一定能保证看得…

MySQL数据控制语言DCL

MySQL数据控制语言DCL 目录 MySQL数据控制语言DCLDCL关键字1.事务事务的四大特性START TRANSACTION&#xff1a;开始事务ROLLBACK&#xff1a;回滚COMMIT&#xff1a;提交事务 2.用户权限CREATE USER&#xff1a;创建新的用户并指定权限DROP USER&#xff1a;删除用户ALTER USE…

深度强化学习(王树森)笔记10

深度强化学习&#xff08;DRL&#xff09; 本文是学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接&#xff1a;https://github.com/wangshusen/DRL 源代码链接&#xff1a;https://github.c…

LeetCode —— 17. 电话号码的字母组合

&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️Take your time ! &#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️…

基于人体姿态的目标追踪实现

文章目录 概要人体姿态识别人体关键点转检测框实时跟踪器概要 这篇博文简单介绍了如何实现基于人体姿态的多目标跟踪算法。主要分为以下几个步骤: 基于FastDeploy实现人体姿态识别;将人体姿态转化为检测框;基于SORT算法实现目标跟踪。人体姿态识别 参考Fastdeploy实现。 模…

Ubuntu系统硬盘分区攻略(磁盘分区、RAID磁盘阵列、RAID阵列、固态硬盘分区、机械硬盘分区、swap分区、swap交换分区)

文章目录 分区需求分区方案分区顺序相关疑问swap分区不是应该放在最后吗&#xff1f;我安装系统分区的时候&#xff0c;上面有available devices&#xff0c;下面有create software raid(md)&#xff0c;我该用哪个&#xff1f;我available devices下面有个893G的固态&#xff…

Selenium自动化测试 —— 模拟鼠标键盘的操作事件

鼠标操作事件 在实际的web产品测试中&#xff0c;对于鼠标的操作&#xff0c;不单单只有click()&#xff0c;有时候还要用到右击、双击、拖动等操作&#xff0c;这些操作包含在ActionChains类中。 ActionChains类中鼠标操作常用方法&#xff1a; 首先导入ActionChains类&#…

Python OpenCV实现图片像素区域缩放

Python OpenCV实现图片像素区域缩放 前言项目安装OpenCV和Pillow思路代码编写 前言 遇到一个要将大量图片缩放成统一规格的难题&#xff0c;并且这些图片周围还有很多空白像素&#xff0c;所以用Python实现一下。 项目 安装OpenCV和Pillow pip install opencv-python pip …

C++:异常体系

异常体系 异常1.C语言传统的处理错误的方式2.C异常概念3.异常的使用3.1异常的抛出和捕获3.2 异常的重新抛出3.3异常安全3.4 异常规范 4.C标准库的异常体系5.异常的优缺点 异常 1.C语言传统的处理错误的方式 终止程序&#xff0c;如assert&#xff0c;缺陷&#xff1a;用户难以…

MyBatisPlus的基本使用之QueryWrapper

QueryWrapper是MyBatis-Plus中的一个查询封装类&#xff0c;用于构建带有条件的查询语句。 1. QueryWrapper 使用普通的方式来设置查询条件&#xff0c;而不是使用Lambda表达式。 一系列方法设置查询条件。手动指定数据库表的列名作为方法的参数 select 设置查询的字段 eq、…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之TextClock组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之TextClock组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、TextClock组件 TextClock组件通过文本将当前系统时间显示在设备上。支持不同…

Linux 内核版本和发布历史

版本命名 在 2.6.x 版本以前&#xff0c;托瓦兹将核心的发展趋势分为两股&#xff0c;并根据这两股核心的发展分别给予不 同的核心编号。次版本为奇数表示发展中版本(development) 如2.5.xx&#xff0c;这种核心版本主要用在测试与测试新功能。次版本为偶数表示稳定版本 (stab…