身份证识别JAVA+OPENCV+OCR
一、相关的地址
https://github.com/tesseract-ocr/tessdata
Releases - OpenCV
opencv要装好,我装的是4.5.3的,最新版的没试过。
tessdata就下载了需要用的。好像还有best和fast的版本,我试了一下报错,不知道是不是版本不支持的问题。
二、主要的思路
识别的代码到没什么特别的,就是在每一行的识别上,为了提高准确度,稍微花了点心思,但也不时很完善。
发现识别的时候会出现很多干扰,所以从“姓”这一行开始算第一行,然后一行一行分析。
如果图片不清晰,不是太准,有待改进。
三、代码
pom.xml的依赖:
<!-- OpenCV --><dependency><groupId>org.openpnp</groupId><artifactId>opencv</artifactId><version>4.5.3-4</version></dependency><!-- Tesseract --><dependency><groupId>net.sourceforge.tess4j</groupId><artifactId>tess4j</artifactId><version>5.11.0</version> <!-- 使用最新版本 --></dependency>
JAVA代码:
package com.yutiandada.idcardread.demos.test;import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;import net.sourceforge.tess4j.*;public class IDCardRecognition2 {static {System.setProperty("java.library.path", "D:\\opencv\\opencv\\build\\java\\x64");try {Field fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths");fieldSysPath.setAccessible(true);fieldSysPath.set(null, null);} catch (Exception e) {e.printStackTrace();}System.loadLibrary(Core.NATIVE_LIBRARY_NAME);}public static Mat preprocessImage(String imagePath) {// 读取图像Mat image = Imgcodecs.imread(imagePath);// 可选:进行一些图像增强操作,例如锐化Mat enhancedImage = new Mat();Imgproc.GaussianBlur(image, enhancedImage, new Size(0, 0), 3);Core.addWeighted(image, 1.5, enhancedImage, -0.5, 0, enhancedImage);return enhancedImage;}public static List<String> recognizeText(Mat mat) throws TesseractException {try {// 将Mat转换为FileFile tempFile = File.createTempFile("temp", ".png");Imgcodecs.imwrite(tempFile.getAbsolutePath(), mat);// 初始化TesseractTesseract tesseract = new Tesseract();tesseract.setLanguage("chi_sim"); // 设置语言为简体中文tesseract.setDatapath("d:/tessdata"); // 设置Tesseract数据路径
// tesseract.setPageSegMode(PageSegMode.PSM_AUTO); // 设置页面分割模式// 进行OCR识别String result = tesseract.doOCR(tempFile);tempFile.delete(); // 删除临时文件// 将结果按行分割List<String> lines = new ArrayList<>();String[] splitResult = result.split("\\r?\\n");for (String line : splitResult) {if (!line.trim().isEmpty()) {lines.add(line.trim());}}return lines;} catch (IOException e) {// 处理异常,例如记录日志或显示错误信息e.printStackTrace();throw new TesseractException("Error during OCR processing", e);}}public static void main(String[] args) {try {String imagePath = "D:/images/test01.png";Mat processedImage = preprocessImage(imagePath);List<String> recognizedLines = recognizeText(processedImage);System.out.println("Recognized Text:");// 找到包含“姓”字的行索引int startIndex = -1;for (int i = 0; i < recognizedLines.size(); i++) {if (recognizedLines.get(i).contains("姓") || recognizedLines.get(i).contains("名") ) {startIndex = i;break;}}if (startIndex != -1) {// 从包含“姓”字的行开始重新编号List<String> filteredLines = recognizedLines.subList(startIndex, recognizedLines.size());// 第一行:“姓名”之后的字符串String name = filteredLines.get(0).replaceAll(".*姓名", "").trim();System.out.println("Name: " + name);// 第二行:性别String gender = "";String ethnicity = "";String secondLine = filteredLines.get(1);if (secondLine.contains("男")) {gender = "男";} else if (secondLine.contains("女")) {gender = "女";}int minIndex = secondLine.indexOf("民") + 2;if (minIndex > 0 && minIndex < secondLine.length()) {ethnicity = secondLine.substring(minIndex).trim();}System.out.println("Gender: " + gender);System.out.println("Ethnicity: " + ethnicity);// 第三行:出生日期,只显示数字String thirdLine = filteredLines.get(2).replaceAll("[^0-9]", "").trim();if (thirdLine.length() == 8) {String birthYear = thirdLine.substring(0, 4);String birthMonth = thirdLine.substring(4, 6);String birthDay = thirdLine.substring(6, 8);System.out.println("Birth Year: " + birthYear);System.out.println("Birth Month: " + birthMonth);System.out.println("Birth Day: " + birthDay);} else {System.out.println("Invalid date format in the third line.");}// 第四行:地址String addressPart1 = filteredLines.get(3).replaceAll("\\s+", "").substring(2).trim();String addressPart2 = filteredLines.get(4).replaceAll("\\s+", "").trim();String address = addressPart1 + addressPart2;System.out.println("Address: " + address);// 第六行:身份证号,只显示数字和字母String idNumber = filteredLines.get(5).replaceAll("[^a-zA-Z0-9]", "").trim();System.out.println("ID Number: " + idNumber);} else {System.out.println("No line containing '姓' found.");}} catch (Exception e) {e.printStackTrace();}}
}
IDEA里面要配置一下
把安装好的OPENCV装一下
四、效果
网上随便找的图
识别的效果
相关文章:
身份证识别JAVA+OPENCV+OCR
一、相关的地址 https://github.com/tesseract-ocr/tessdata Releases - OpenCV opencv要装好,我装的是4.5.3的,最新版的没试过。 tessdata就下载了需要用的。好像还有best和fast的版本,我试了一下报错,不知道是不是版本不支持…...
独立开发者如何利用AI实现高收入
引言 在探索独立开发领域时,AI技术的出现为开发者打开了新世界的大门。本文将分享如何利用AI技术提高开发效率,实现更高的收入。 AI在编程中的应用 AI技术的快速发展为独立开发者带来了前所未有的机遇。通过使用AI,我们可以: …...
Go第三方框架--gorm框架(一)
前言 orm模型简介 orm模型全称是Object-Relational Mapping,即对象关系映射。其实就是在原生sql基础之上进行更高程度的封装。方便程序员采用面向对象的方式来操作数据库,将表映射成对象。 这种映射带来几个好处: 代码简洁:不用…...
ONLYOFFICE文档8.2:开启无缝PDF协作
ONLYOFFICE 开源办公套件的最新版本新增约30个新功能,并修复了超过500处故障。 什么是 ONLYOFFICE 文档 ONLYOFFICE 文档是一套功能强大的文档编辑器,支持编辑处理文档、表格、幻灯片、可填写的表单和PDF。可多人在线协作,支持插件和 AI 集…...
内网python smtplib用ssh隧道通过跳板机发邮件
Python 自带 smtplib 包可以发邮件,示例见 [1,2],在邮箱设置启用 IMAP/POP3 就能用。有些邮箱需要设置授权码,如新浪、163 邮箱,然后以授权码作为 smtplib 登录服务器的密码。邮箱端配置参考 [3,4]。 现在情况是: 邮…...
基于C#开发游戏辅助工具的Windows底层相关方法详解
开发游戏辅助工具通常需要深入了解Windows操作系统的底层机制,以及如何与游戏进程进行有效交互。本文将基于C#语言,从Windows底层方法的角度来详细讲解开发游戏辅助工具的相关技术和概念。 一、游戏辅助工具的基本概述 游戏辅助工具,通常被称…...
SSRF+Redis进行内网渗透
SSRFRedis进行内网渗透 一 环境搭建 准备一台服务器,开启了lampp以及redis,redis只允许内网访问 把上面这个注释放开后,redis就只能内网访问 启动redis 使用kali进行端口扫描,扫不到6379端口 kali连接不上redis ssrf漏洞代码 &…...
栈与队列-Java【力扣】【算法学习day.7】
前言 我做这类文档一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴&#…...
最新版本!IntelliJ IDEA 2024.2.4 (Ultimate Edition) 的新特性
IntelliJ IDEA 2024.2版本(Ultimate Edition)的关键新特性包括: 改进的Spring Data JPA支持: 允许在IDE中直接运行Spring Data JPA方法,进行即时仓库查询验证。 无需运行应用程序或分析日志文件,即可查看…...
从头学PHP之运算符
关于运算符的图片均来自网络,主要是自己写太麻烦了,程序是个简化自己工作量的方式,能复制粘贴就不要手写了(建议初期还是多写写,加深下记忆)在这里我就偷个懒,图片涉及到侵权及时,请…...
使用 Git LFS(大文件存储)
Git LFS(Large File Storage)是一种扩展 Git 的工具,旨在更有效地管理大文件的版本控制。它通过将大文件的内容存储在 Git 之外来解决 Git 在处理大文件时的性能问题。 主要特点 替代存储:Git LFS 不直接将大文件存储在 Git 仓库…...
js 将一维数组转换成树形结构的方法
一维数组的数据结构,如下 const flatArray [ { id: 1, parent_id: null, name: ‘root1’ }, { id: 2, parent_id: null, name: ‘root2’ }, { id: 3, parent_id: 1, name: ‘child1’ }, { id: 4, parent_id: 2, name: ‘child2’ }, { id: 5, parent_id: 3, nam…...
HarmonyOS NEXT开发实战:实现高效下拉刷新与上拉加载组件(二)刷新核心逻辑与空页面集成
前言: 在上一篇文章中,我们深入探讨了如何在HarmonyOS中实现一个功能完备的空页面组件。现在,我们将进入下拉刷新和上拉加载功能的核心逻辑实现。这不仅仅是技术实现,更是对用户体验的深刻理解。本文将详细介绍如何将空页面与下拉刷新、上拉加载逻辑相结合,打造一个既高效…...
Crawler4j在多线程网页抓取中的应用
网页爬虫作为获取网络数据的重要工具,其效率和性能直接影响到数据获取的速度和质量。Crawler4j作为一个强大的Java库,专门用于网页爬取,提供了丰富的功能来帮助开发者高效地抓取网页内容。本文将探讨如何利用Crawler4j进行多线程网页抓取&…...
【无标题】Django转化为exe,app
目录 1. 将 Django 项目转换为 .exe 文件(Windows)2. 将 Django 项目转换为 .app 应用程序(macOS)3. 发布到微信公众号将一个 Django 项目转换为 .exe 文件或 .app 应用程序,并发布到微信公众号,实际上涉及多个步骤和技术。下面我将分别介绍这些过程。 1. 将 Django 项目…...
HTML5_标签_各类表格的实现
目录 1. 表格标签 1.1 表格的主要作用 1.2 表格的基本语法 1.3 表头单元格标签 1.4 表格属性 案例分析 先制作表格的结构. 后书写表格属性. 代码示例: 1.5 表格结构标签 1.6 合并单元格 合并单元格方式: 目标单元格:(写合并代码) 合并单元…...
C语言数据结构之单向链表(SingleList)
C语言数据结构之单向链表(SingleList) 自定义结构体数据类型SListNode表示单向链表的节点,成员包括一个无类型的data用来存贮数据和一个SListNode本身类型的指针next,指向下一个节点。围绕SListNode写一系列函数以slist_开头实现…...
【银河麒麟高级服务器操作系统实例】金融行业TCP连接数猛增场景的系统优化
了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:https://product.kylinos.cn 开发者专区:https://developer.kylinos.cn 文档中心:https://documentkylinos.cn 服务器环境以及配置 物理机/虚拟机/云/容器 物理…...
详解Java的类文件结构(.class文件的结构)
this_class 指向常量池中索引为 2 的 CONSTANT_Class_info。super_class 指向常量池中索引为 3 的 CONSTANT_Class_info。由于没有接口,所以 interfaces 的信息为空。 对应 class 文件中的位置如下图所示。 06、字段表 一个类中定义的字段会被存储在字段表&#x…...
爆肝整理14天!AI工具宝藏合集
随着AI技术的飞速发展,各类AI工具如雨后春笋般涌现。经过对上百款AI工具的深入探索与测试,我精心挑选出了一些功能强大的AI神器,这些工具将极大地降低自媒体创作的门槛。 🚀无论是撰写文案、剪辑视频、设计图文,还是处…...
高效库存管理:金蝶云星空与管易云的盘亏单对接方案
高效库存管理:金蝶云星空与管易云的盘亏单对接方案 金蝶云星空与管易云的盘亏单对接方案 在企业日常运营中,库存管理是至关重要的一环。为了实现高效、准确的库存盘点和数据同步,我们采用了轻易云数据集成平台,将金蝶云星空的数据…...
小鹏汽车股价分析:看涨信号已出现,技术指标显示还有40%的上涨空间
猛兽财经核心观点: (1)小鹏汽车的股价过去几天有所回落。 (2)随着需求的上升,该公司的业务发展的还算不错。 (3)猛兽财经对小鹏汽车股价的技术分析:多头已经将目标指向15…...
c语言指针详解2
c语言指针详解2 1.数组名理解 数组名其实是地址,是数组首元素的地址(详解1有提及) 我们可以根据打印来确认 我们发现数组名和数组⾸元素的地址打印出的结果⼀模⼀样,数组名就是数组⾸元素(第⼀个元素)的地址。 但是上述结论有…...
Chrome DevTools 二: Performance 性能面板
Chrome DevTools 第二篇 Performance 主要介绍performance在我们日常开发中所起到的作用,以及如何利用performance 面板进行性能分析和相关优化建议。 性能面板 Performance 记录和分析页面运行中的所有活动,是解决前端性能问题的重要工具。 1. 控制栏…...
渠道推广如何识别与防止虚假流量?
在当今竞争激烈的游戏市场中,渠道推广作为游戏开发商拓展用户基础、提升市场渗透率的关键手段,其重要性不言而喻。然而,随着市场的发展,渠道作弊问题日益严重,虚假流量、刷假量、拉人风险和违规代充等行为频繁出现&…...
Keil C51 9.61__官网“最新版“下载、安装及相关提示( 保姆级教程, 安装过程详解, 附安装包 )
前言 Keil 5常用的分两个版本,C51 和 MDK。C51用于编译8051内核的单片机程序,譬如AT89C51、STC89C51、STC98C52等。MDK用于编译STM32、GD32等ARM32位内核单片机程序。 Keil C51是由Keil Software Company开发的,专门用于8051微控制器的…...
二进制搭建 Kubernetes v1.20
k8s集群master01etcd集群节点1192.168.190.80 kube-apiserver kube-controller-manager kube-scheduler etcdk8s集群node01etcd集群节点2192.168.190.60kubelet kube-proxy docker etcdk8s集群node02etcd集群节点3192.168.190.70etcd VIP192.168.190.100 k8…...
我希望,你把篮球和鸡联系起来想一想。。。
“我希望,你把篮球和鸡联系起来想一想。” “篮球和鸡?” “我有一个好点子…” 目录 创建页面页面准备实现基础样式实现鸡的跑马灯 篮球弹跳实现篮球击出检查是否击中鸡并计算得分实现看一眼就爆炸效果 总结技术点完整代码 创建页面 页面准备 首先开始万恶的第一…...
STM32 ADC介绍
文章目录 STM32 ADC介绍一、ADC的基本概念二、STM32 ADC的主要特点高分辨率:多通道输入:多种工作模式:内置温度传感器和参考电压: 三、ADC的工作原理采样阶段:转换阶段:数据存储: 四、ADC的配置…...
JavaWeb合集12-Redis
十二、Redis 1、Redis 入门 Redis是一个基于内存的key-valule 结构数据库。 特点:基于内存存储,读写性能高 场景:适合存储热点数据(热点商品、资讯、新闻) Redis安装包分为Windows版和Linux版: Windows版 下载地址: https://gith…...
厦门企业网站开发/seo优化在线
Codrops 给我们分享了一组新鲜的按钮样式和效果的集合。它们中的大部分效果都使用了 CSS3 过渡和伪元素,他们都有一个共同点,那就是简单性,没有太多的动画,而是尝试添加一些通过颜色和形状的变化呈现的效果。 在线演示 源码下…...
贵阳市做网站的公司/网站自助搭建
详解 Vue 目录及配置文件之 node_modules,src,static,test 目录 1.1 项目目录介绍 目录/文件说明 详解 build项目构建(webpack)相关代码详解config配置目录,包括端口号等详解node_modulesnpm 加载的项目依赖模块详解src这里是我们…...
兰州模板型网站建设/免费s站推广网站
谁告诉我说KinectFusion不能直接在Kinect2上直接用。今天心血来潮看了一下Kinect for Windows SDK中的头文件,发现完全可以用啊。 于是用SDK自带的Demo测试了一下: 发现存在一些问题,首先重建人并不容易。转360度其实还是不容易的,…...
集团高端网站/整站seo排名
制作一个Ring Menu需要有以下基础: 1. 熟练掌握元素的布局与定位; 2. 熟练掌握对元素边框的处理; 3. 熟练掌握伪类:hover的应用; 4. 熟练掌握子选择器的应用; 5. 熟练掌握背景处理; 6. 熟练掌握2D变换…...
深圳 网站开发公司电话/网站的排名优化怎么做
概念meta-data就像其名一样,主要用来定义一些组件相关的配置值。按照官方定义,metadata是一组供父组件使用的名值对(name-value pair),因此相应的meta-data元素应该定义在相应的组件中。即如果想在activity中使用metadata,那么met…...
南山老品牌网站建设/上海seo推广
各种字符串Hash函数比较 https://www.byvoid.com/blog/string-hash-compare 字符串Hash函数对比 http://blog.csdn.net/icefireelf/article/details/5796529 Python 内置hash函数: import hash sha1obj hashlib.sha1() sha1obj.update(title_a) hash sha1obj.h…...