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

news2024/11/17 3:50:24

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.coloradmin.cn/o/1419881.html

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

相关文章

谷歌人工智能视频生成器-LUMIERE(未开源)

Google重磅发布视频生成模型Lumiere 据说后续会开源 亮点1.支持文本到视频与图像到视频 亮点2.画风迁移 亮点3.运动蒙版 亮点4.视频编辑 亮点5.视频修复 谷歌视频模型可以生成80帧的片段&#xff01;不仅画质好、质量高&#xff0c;而且时长更长。 视频局部编辑 这项功能可以…

Python进阶(4) | 创建Python库的模板工程 Python-lib-starter

Python进阶(4) | 创建Python库的模板工程 Python-lib-starter 文章目录 Python进阶(4) | 创建Python库的模板工程 Python-lib-starter1. 目的2. Python-lib-starter 目录结构浅析2.1 关键目录和文件2.2 非关键目录和文件 3. moelib 目录分析3.1 __init__.py延迟评估类型注解的意…

flink cdc,standalone模式下,任务运行一段时间taskmanager挂掉

在使用flink cdc&#xff0c;配置任务运行&#xff0c;过了几天后&#xff0c;任务无故取消&#xff0c;超时&#xff0c;导致taskmanager挂掉&#xff0c;相关异常如下&#xff1a; 异常1&#xff1a; did not react to cancelling signal interrupting; it is stuck for 30 s…

最新详细eclipse下载、安装、汉化教程

一、下载eclipse安装包 首先进入 eclipse官网 如下&#xff1a; 这里面有很多版本&#xff1b;我们小白一般选择第二个&#xff0c;向下滑动&#xff1b; 点击符合自己系统的版本。 这里我们切换镜像下载&#xff0c;一般选择离你最近的地址下载。 我建议选择大连东软信息学…

Python 数据分析实战——社交游戏的用户流失?酒卷隆治_案例2

# 什么样的顾客会选择离开 # 数据集 DAU : 每天至少来访问一次的用户数据 数据内容 数据类型 字段名 访问时间 string&#xff08;字符串&#xff09; log_data 应用名称 string&#xff08;字符串&#xff09; app_name 用户 ID int&#xff08;数值&#xff09; user_id…

项目经理,如何管理好自己的情绪?

在现代社会中&#xff0c;压力无处不在。对于项目经理来说&#xff0c;压力更是来自各个方面&#xff0c;如项目进度、团队管理、客户需求等。当压力过大时&#xff0c;情绪就容易受到影响&#xff0c;如果无法控制自己的情绪&#xff0c;不仅会影响自己的工作效率&#xff0c;…

uniapp对接微信APP支付返回requestPayment:fail [payment微信:-1]General errors错误-全网总结详解

一、问题描述 uniapp对接微信APP支付&#xff0c;本来是很简单的一件事&#xff0c;后端本来就是好的&#xff0c;只要填一些参数就行了&#xff0c;搞了我一晚上&#xff0c;主要卡在uniapp这边&#xff0c;拉起支付的时候&#xff0c;一直提示以下错误&#xff1a; {"er…

Celery基础用法

Celery概述 Celery是一个分布式任务调度模块&#xff0c;用于在Python中处理异步任务。它允许你创建任务&#xff0c;并发送给工作节点执行。 Celery常常用于我们说的脏活&#xff0c;累活&#xff0c;处理耗时的操作&#xff0c;如发送电子邮件、处理数据、执行计算等。 上手非…

pytorch安装教程(Anaconda + GPU)

可以去nvidia官网更新驱动 获取下载pytorch的命令地址&#xff1a;Start Locally | PyTorch 在这里可以找到旧版本的cuda的命令&#xff1a;Previous PyTorch Versions | PyTorch 如果使用conda没有安装成功的话&#xff0c;就使用pip&#xff1a;

pytorch 实现中文文本分类

&#x1f368; 本文为[&#x1f517;365天深度学习训练营学习记录博客&#x1f366; 参考文章&#xff1a;365天深度学习训练营&#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制]\n&#x1f680; 文章来源&#xff1a;[K同学的学习圈子](https://www.yuque.com/mi…

故障诊断 | 一文解决,CNN卷积神经网络故障诊断(Matlab)

文章目录 效果一览文章概述专栏介绍源码设计参考资料效果一览 文章概述 故障诊断 | 一文解决,CNN卷积神经网络故障诊断(Matlab) 专栏介绍 订阅【故障诊断】专栏,不定期更新机器学习和深度学习在故障诊断中的应用;订阅

自然语言nlp学习 三

4-8 Prompt-Learning--应用_哔哩哔哩_bilibili Prompt Learning&#xff08;提示学习&#xff09;是近年来在自然语言处理领域中&#xff0c;特别是在预训练-微调范式下的一个热门研究方向。它主要与大规模预训练模型如GPT系列、BERT等的应用密切相关。 在传统的微调过程中&a…

【C++】Vulkan:计算机图形学Vulkan基础与环境配置

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍计算机图形学Vulkan基础与环境配置。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&a…

pve web无法访问

一、问题描述 我这边修改了网络,导致ip发生了变更,pve网页版直接登不上了,ssh又可以登录。 二、解决方法 首先确认是不是网络的问题&#xff0c;我这边是内网&#xff0c;有多个路由器&#xff0c;笔记本连的是一个网段&#xff0c;pve又是一个网段&#xff0c;通过ping&…

Unity打包Android,jar文件无法解析的问题

Unity打包Android&#xff0c;jar无法解析的问题 介绍解决方案总结 介绍 最近在接入语音的SDK时&#xff0c;发现的这个问题. 当我默认导入这个插件的时候&#xff0c;插件内部的文件夹&#xff08;我下面话红框的文件夹&#xff09;名字原本为GCloudVoice&#xff0c;这时候我…

Spring Boot导出EXCEL 文件

主要功能:实现java导出excel到本地 JDK版本&#xff1a;openJDK 20.0.1 依赖pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchem…

Java / Spring Boot + POI 给 Word 添加水印

1、前言(瞎扯) 有个需求&#xff1a;整一个给 Word 加水印的demo&#xff0c;于是我就网上找呗~ 看到那个 Aspose 好像是收费的&#xff0c;然后就把目光转向了 POI&#xff0c;看到各种形形色色的也不知道哪个能用。整了一会&#xff0c;自己拷贝出一个比较精简的能用的 demo …

Ubuntu搭建国标平台wvp-GB28181-pro

目录 简介安装和编译1.查看操作系统信息2.安装最新版的nodejs3.安装java环境4.安装mysql5.安装redis6.安装编译器7.安装cmake8.安装依赖库9.编译ZLMediaKit9.1.编译结果说明 10.编译wvp-GB28181-pro10.1.编译结果说明 配置1.WVP-PRO配置文件1.1.Mysql数据库配置1.2.REDIS数据库…

封装通用mixins,在vue中实现a-table组件的可伸缩列(详细且使用便捷)

1、实现效果 2、使用场景 vue2 antd-vue 1.x版本由于antd-vue 1.x版本的组件库没有提供可伸缩列的功能&#xff0c;才需要我们手动开发在antd-vue 3.x版本以上的表格已经支持这个功能&#xff0c;不需要我们再去手动开发 3、话不多说&#xff0c;上代码 首先安装vue-dragga…

Android MediaCodec 简明教程(四):使用 MediaCodec 将视频解码到 Surface,并使用 SurfaceView 播放视频

系列文章目录 Android MediaCodec 简明教程&#xff08;一&#xff09;&#xff1a;使用 MediaCodecList 查询 Codec 信息&#xff0c;并创建 MediaCodec 编解码器Android MediaCodec 简明教程&#xff08;二&#xff09;&#xff1a;使用 MediaCodecInfo.CodecCapabilities 查…