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

本文主要是介绍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能用挺友好
  • 缺点是识别率有点儿低

这篇关于AI工具【OCR 01】Java可使用的OCR工具Tess4J使用举例(身份证信息识别核心代码及信息提前方法分享)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/660889

相关文章

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

SQLite3命令行工具最佳实践指南

《SQLite3命令行工具最佳实践指南》SQLite3是轻量级嵌入式数据库,无需服务器支持,具备ACID事务与跨平台特性,适用于小型项目和学习,sqlite3.exe作为命令行工具,支持SQL执行、数... 目录1. SQLite3简介和特点2. sqlite3.exe使用概述2.1 sqlite3.exe

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

SpringBoot整合Flowable实现工作流的详细流程

《SpringBoot整合Flowable实现工作流的详细流程》Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable流程引擎可用于部署BPMN2.0流程定义,创建这些流程定义的... 目录1、流程引擎介绍2、创建项目3、画流程图4、开发接口4.1 Java 类梳理4.2 查看流程图4

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(

Python虚拟环境与Conda使用指南分享

《Python虚拟环境与Conda使用指南分享》:本文主要介绍Python虚拟环境与Conda使用指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、python 虚拟环境概述1.1 什么是虚拟环境1.2 为什么需要虚拟环境二、Python 内置的虚拟环境工具