java实现识别图片上的文字(OCR识别身份证等证件信息)

news2024/11/17 15:42:20

利用第三方jar包,实现识别图片上的文字。第三方支持地址:Spire.OCR for Java | 专业的图文识别组件,用以读取图片格式中的文本Spire.OCR for Java 是专为 Java 开发者设计的强大OCR库,提供高效的文字识别功能,能够从图像中准确识别和提取文本。icon-default.png?t=N7T8https://www.e-iceblue.cn/Introduce/Spire-OCR-JAVA.html

1.maven项目,添加依赖

<dependency>
    <groupId>e-iceblue</groupId>
    <artifactId>spire.ocr</artifactId>
    <version>1.9.0</version>
</dependency>

<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <name>e-iceblue</name>
        <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
    </repository>
</repositories>

2.根据服务器类型,下载相关依赖文件

linux

windows

3.编写demo代码

    @Test
    public void getText() throws OcrException {
        //指定依赖文件的路径
        String dependencies = "dependencies/";
        //指定要需要扫描的图片的路径
        String imageFile = "C:\\Users\\user\\Desktop\\3.jpg";
        //指定输出文件的路径
        String outputFile = "test.txt";

        //创建OcrScanner对象,并设置其依赖文件路径
        OcrScanner scanner = new OcrScanner();
        scanner.setDependencies(dependencies);

        //扫描指定的图像文件
        scanner.scan(imageFile);
        //获取扫描的文本内容
        String scannedText = scanner.getText().toString();
        System.out.println(scannedText);
    }

4.扩展

根据图片OCR识别,来获取身份证等证件图片上的信息,并用正则表达式解析识别的文字

    @Test
    public void testIdcard() throws OcrException {
        String filePath = "C:\\Users\\85753\\user\\idcard\\";
        for (int i = 1; i < 11; i++) {
            long startTime = System.currentTimeMillis();
            HashMap<String, String> hashMap = idCardOCR(filePath + i + ".jpg");
            long endTime = System.currentTimeMillis();
            System.out.println(hashMap);
            System.out.println("一共耗时:" + (startTime - endTime) + "毫秒!");
        }
    }

    public HashMap<String, String> idCardOCR(String filePath) throws OcrException {
        //指定依赖文件的路径
        String dependencies = "dependencies/";
        //指定要需要扫描的图片的路径
        String imageFile = filePath;

        //创建OcrScanner对象,并设置其依赖文件路径
        OcrScanner scanner = new OcrScanner();
        scanner.setDependencies(dependencies);
        scanner.scan(imageFile);//扫描指定的图像文件

        //获取扫描的文本内容
        String scannedText = scanner.getText().toString();

        // 去除换行,去除无用数据
        String result = scannedText.replaceAll("\r", "").replaceAll("\n", "");
        result = result.replaceAll("Evaluation Warning : The version can be used only for     evaluation purpose...", "");
        System.out.println(result);

        HashMap<String, String> map = new HashMap<>();
        map = this.dealIDCardText(result);

        return map;
    }

    /**
     * 正则处理识别的身份证数据
     *
     * @param result
     * @return
     */
    public static HashMap<String, String> dealIDCardText(String result) {
        HashMap<String, String> map = new HashMap<>();
        String name = "";
        String sex = "";
        String nation = "";
        String birth = "";
        String address = "";
        String idCard = "";
        // 处理数据(正则表达式获取身份证信息,满足以下一条即可)
        String regex = "姓名(\\S+)民族(\\S+)性别(\\S+)出生(\\d{4}年\\d{1,2}月\\d{1,2}日)住址(\\S+)公民身份号码(\\d{17}[0-9Xx])";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(result);
        String regex2 = "(\\S+)姓名民族(\\S+)性别(\\S+)出生(\\d{4}年\\d{1,2}月\\d{1,2}日)住址(\\S+)(\\d{17}[0-9Xx])公民身份号码";
        Pattern pattern2 = Pattern.compile(regex2);
        Matcher matcher2 = pattern2.matcher(result);
        String regex3 = "姓名(\\S+)性别(\\S+)民族(\\S+)出生(\\d{4}年\\d{1,2}月\\d{1,2}日)住址(\\S+)公民身份号码(\\d{17}[0-9Xx])";
        Pattern pattern3 = Pattern.compile(regex3);
        Matcher matcher3 = pattern3.matcher(result);
        String regex4 = "姓名(\\S+)性别(\\S+)民族(\\S+)出生(\\d{4}年\\d{1,2}月\\d{1,2}日)住址(\\S+)(\\d{17}[0-9Xx])公民身份号码";
        Pattern pattern4 = Pattern.compile(regex4);
        Matcher matcher4 = pattern4.matcher(result);
        String regex5 = "姓名(\\S+)民族(\\S+)性别(\\S+)出生(\\d{4}年\\d{1,2}月\\d{1,2}日)住址(\\S+)(\\d{17}[0-9Xx])公民身份号码";
        Pattern pattern5 = Pattern.compile(regex5);
        Matcher matcher5 = pattern5.matcher(result);
        String regex6 = "(\\S+)姓名性别(\\S+)民族(\\S+)出生(\\d{4}年\\d{1,2}月\\d{1,2}日)住址(\\S+)(\\d{17}[0-9Xx])公民身份号码";
        Pattern pattern6 = Pattern.compile(regex6);
        Matcher matcher6 = pattern6.matcher(result);

        if (matcher.find()) {
            name = matcher.group(1);
            nation = matcher.group(2);
            sex = matcher.group(3);
            birth = matcher.group(4);
            address = matcher.group(5);
            idCard = matcher.group(6);
        } else if (matcher2.find()) {
            name = matcher2.group(1);
            nation = matcher2.group(2);
            sex = matcher2.group(3);
            birth = matcher2.group(4);
            address = matcher2.group(5);
            idCard = matcher2.group(6);
        } else if (matcher3.find()) {
            name = matcher3.group(1);
            sex = matcher3.group(2);
            nation = matcher3.group(3);
            birth = matcher3.group(4);
            address = matcher3.group(5);
            idCard = matcher3.group(6);
        } else if (matcher4.find()) {
            name = matcher4.group(1);
            sex = matcher4.group(2);
            nation = matcher4.group(3);
            birth = matcher4.group(4);
            address = matcher4.group(5);
            idCard = matcher4.group(6);
        } else if (matcher5.find()) {
            name = matcher5.group(1);
            nation = matcher5.group(2);
            sex = matcher5.group(3);
            birth = matcher5.group(4);
            address = matcher5.group(5);
            idCard = matcher5.group(6);
        } else if (matcher6.find()) {
            name = matcher6.group(1);
            sex = matcher6.group(2);
            nation = matcher6.group(3);
            birth = matcher6.group(4);
            address = matcher6.group(5);
            idCard = matcher6.group(6);
        }

        map.put("name", name);
        map.put("sex", sex);
        map.put("nation", nation);
        map.put("birth", birth);
        map.put("address", address);
        map.put("idCard", idCard);

        return map;
    }

注意:因图片识别后的身份证数据顺序不固定,经过多次测试,将可能的结果通过正则表达式来解析。如果符合其中一个正则,就将匹配的数据返回。

参考:如何在 Java 项目中扫描识别图片中的文字

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

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

相关文章

Proxy 代理

意图 为其它对象提供一种代理以控制这个对象的访问。 结构 Proxy保存一个引用使得代理可以访问实体&#xff1b;提供一个与Subject的接口相同的接口&#xff0c;使代理可以用来替代实体&#xff1b;控制实体的存取&#xff0c;并可能负责创建和删除它&#xff1b;其他功能依赖…

企业文档知识库建设,数据安全如何保障?

随着现代市场经济的高速发展&#xff0c;企业的竞争优势越来越多体现在人才和科技的优势。而随着员工流动率的提升&#xff0c;随之流失的则是员工积累多年的宝贵工作经验&#xff0c;如果缺乏有效的内部知识库的建设和管理&#xff0c;企业的竞争优势将难以维系。「企业网盘」…

网络管理实验三、SNMP协议工作原理验证与分析

1 实验概括 实验目的&#xff1a; 学习捕获SNMP报文&#xff0c;通过报文分析理解SNMP协议的工作过程。 实验内容&#xff1a; 1&#xff09; 使用snmputilg发送SNMP数据包; 使用wireshark抓包&#xff1b;使用netstat –an查看代理站TCP/UDP连接表&#xff1b; 2&#xff09;…

单机调度问题(第i工件的完工时间=加工时间+等待时间)

第08章 制造系统的调度控制 - 百度文库 (baidu.com) 模拟退火单机极小化总流水时间的排序问题_哔哩哔哩_bilibili 在单机调度问题中&#xff0c;工件的完工时间是一个至关重要的指标&#xff0c;因为它直接反映了生产效率的高低。而完工时间的计算&#xff0c;必须同时考虑工件…

cocos creator 3.6 发布web手机端 加载进度条添加

cocos creator 升级到3.x之后加载进度条取消了&#xff0c;测试了多个3.x版本最终以creator 3.6.3版本&#xff0c;构建了简单的进度加载 参考链接&#xff1a; https://forum.cocos.org/t/topic/137113 打包web-mobile后&#xff0c;没有进度条。加载的时候只显示一个黑屏。…

贪吃蛇设计详解

在去年12月中&#xff0c;初次接触c语言&#xff0c;我靠着为数不多的知识&#xff0c;使用数组仿照写了一份贪吃蛇&#xff0c;现在时隔5个月&#xff0c;我已经有能力独立写出真正的贪吃蛇而不是简单的仿照&#xff08;虽然写的是挺简单的&#xff09;。 那么我们现在就正式…

在ComfyUI中使用Deforum简单步骤, 以及报错处理

⛳背景 deforum这个插件其实去年就在webui流行的时候火过一阵子&#xff0c;效果的话&#xff0c;因为并没有引入太多“时间”的概念&#xff0c;所以画面基本上每一帧都不一样&#xff0c;但也恰恰因为这个&#xff0c;所以可以产生很多宛若吃了毒蘑菇的视频&#xff0c;后来…

Rokid AR Lite空间计算套装发布,软硬件全面升级推动居家、出行、户外场景大规模应用

4月20日&#xff0c;以“好玩、好看、好上头”为主题的Rokid Open Day 2024发布会在杭州举行&#xff0c;Rokid对外正式发布新一代AR Lite空间计算套装&#xff0c;分享了近期Rokid在AR开发者生态和数字文化领域的进展和成果&#xff0c;并宣布了多项跨行业重磅合作。作为中国代…

OerOerlikonTCO1200欧瑞康LPCVD system操作使用说明

OerOerlikonTCO1200欧瑞康LPCVD system操作使用说明

javaWeb项目-智能仓储系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、JSP技术 JSP(Jav…

MySQL 列数据跨表拷贝,一句SQL快速将表A每条记录的某些字段拷贝到表B每条记录的某些字段(A、B表通过ID等字段对应)

文章目录 MySQL 列数据跨表拷贝&#xff0c;一句SQL快速将表A每条记录的某些字段拷贝到表B每条记录的某些字段&#xff08;A、B表通过ID等字段对应&#xff09;背景定义表填充测试数据跨表一 一对应拷贝列数据SQL参考资料 MySQL 列数据跨表拷贝&#xff0c;一句SQL快速将表A每条…

OSPF动态路由实验(思科)

华为设备参考&#xff1a;OSPF动态路由实验&#xff08;华为&#xff09; 一&#xff0c;技术简介 OSPF&#xff08;Open Shortest Path First&#xff09;是一种内部网关协议&#xff0c;主要用于在单一自治系统内决策路由。它是一种基于链路状态的路由协议&#xff0c;通过…

漆包线行业你了解多少?专业漆包线行业MES生产管理系统

今天就说说漆包线行业&#xff0c;漆包线是工业电机&#xff08;包括电动机和发电机&#xff09;、变压器、电工仪表、电力及电子元器件、电动工具、家用电器、汽车电器等用来绕制电磁线圈的主要材料。 漆包线上游是铜杆行业&#xff0c;下游是各种消费终端&#xff0c;主要是电…

详解数据在内存中的存储

系列文章目录 第一章 C语言基础知识 第二章 C语言控制语句 第三章 C语言函数详解 第四章 C语言数组详解 第五章 C语言操作符详解 第六章 C语言指针详解 第七章 C语言结构体详解 文章目录 1. 数据类型 1.1 基本数据类型 1.2 派生数据类型 2. 整形在内存中的存储 2.1 …

力扣练习题(2024/4/18)

1不相交的线 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在&#xff0c;可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线&#xff0c;这些直线需要同时满足&#xff1a; nums1[i] nums2[j]且绘制的直线不与任何其他连线&#xff08;非水平线…

kaggle 房价预测 得分0.53492

流程 导入需要的包引入文件,查看内容数据处理调用模型准备训练输出结果 导入需要的包 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from sklearn.model_selection import train_test_split from sklearn.linear_model i…

Pandas介绍与Series创建

1.Pandas介绍 Pandas 是基于 NumPy 的一种工具&#xff0c;该工具是为解决数据分析任务而创建的&#xff0c;Pandas 提供了大量能使我们快速便捷地处理数据的功能 Pandas 与出色的 Jupyter 工具包和其他库相结合&#xff0c;Python 中用于进行数据分析的环境在性能、生产率和协…

【介绍下WebStorm开发插件】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

稀碎从零算法笔记Day53-LeetCode:不同路径 II

稀碎系列有点更不动(更多是自己懈怠了) 题型&#xff1a;矩阵、模拟 链接&#xff1a;63. 不同路径 II - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &…

Emerald AI 2024

使用易于使用的编辑器和大量内置功能,快速创建高质量的人工智能。 Emerald AI 2024是一个完全重写和重新设计的通用人工智能框架,适用于各种人工智能和游戏类型。它的多组件设计使开发人员能够灵活地只使用他们需要的功能,并允许有组织和可管理的工作流程。Emerald AI经过了…