当前位置: 首页 > news >正文

身份证识别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要装好&#xff0c;我装的是4.5.3的&#xff0c;最新版的没试过。 tessdata就下载了需要用的。好像还有best和fast的版本&#xff0c;我试了一下报错&#xff0c;不知道是不是版本不支持…...

独立开发者如何利用AI实现高收入

引言 在探索独立开发领域时&#xff0c;AI技术的出现为开发者打开了新世界的大门。本文将分享如何利用AI技术提高开发效率&#xff0c;实现更高的收入。 AI在编程中的应用 AI技术的快速发展为独立开发者带来了前所未有的机遇。通过使用AI&#xff0c;我们可以&#xff1a; …...

Go第三方框架--gorm框架(一)

前言 orm模型简介 orm模型全称是Object-Relational Mapping&#xff0c;即对象关系映射。其实就是在原生sql基础之上进行更高程度的封装。方便程序员采用面向对象的方式来操作数据库&#xff0c;将表映射成对象。 这种映射带来几个好处&#xff1a; 代码简洁&#xff1a;不用…...

ONLYOFFICE文档8.2:开启无缝PDF协作

ONLYOFFICE 开源办公套件的最新版本新增约30个新功能&#xff0c;并修复了超过500处故障。 什么是 ONLYOFFICE 文档 ONLYOFFICE 文档是一套功能强大的文档编辑器&#xff0c;支持编辑处理文档、表格、幻灯片、可填写的表单和PDF。可多人在线协作&#xff0c;支持插件和 AI 集…...

内网python smtplib用ssh隧道通过跳板机发邮件

Python 自带 smtplib 包可以发邮件&#xff0c;示例见 [1,2]&#xff0c;在邮箱设置启用 IMAP/POP3 就能用。有些邮箱需要设置授权码&#xff0c;如新浪、163 邮箱&#xff0c;然后以授权码作为 smtplib 登录服务器的密码。邮箱端配置参考 [3,4]。 现在情况是&#xff1a; 邮…...

基于C#开发游戏辅助工具的Windows底层相关方法详解

开发游戏辅助工具通常需要深入了解Windows操作系统的底层机制&#xff0c;以及如何与游戏进程进行有效交互。本文将基于C#语言&#xff0c;从Windows底层方法的角度来详细讲解开发游戏辅助工具的相关技术和概念。 一、游戏辅助工具的基本概述 游戏辅助工具&#xff0c;通常被称…...

SSRF+Redis进行内网渗透

SSRFRedis进行内网渗透 一 环境搭建 准备一台服务器&#xff0c;开启了lampp以及redis&#xff0c;redis只允许内网访问 把上面这个注释放开后&#xff0c;redis就只能内网访问 启动redis 使用kali进行端口扫描&#xff0c;扫不到6379端口 kali连接不上redis ssrf漏洞代码 &…...

栈与队列-Java【力扣】【算法学习day.7】

前言 我做这类文档一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&#…...

最新版本!IntelliJ IDEA 2024.2.4 (Ultimate Edition) 的新特性

IntelliJ IDEA 2024.2版本&#xff08;Ultimate Edition&#xff09;的关键新特性包括&#xff1a; 改进的Spring Data JPA支持&#xff1a; 允许在IDE中直接运行Spring Data JPA方法&#xff0c;进行即时仓库查询验证。 无需运行应用程序或分析日志文件&#xff0c;即可查看…...

从头学PHP之运算符

关于运算符的图片均来自网络&#xff0c;主要是自己写太麻烦了&#xff0c;程序是个简化自己工作量的方式&#xff0c;能复制粘贴就不要手写了&#xff08;建议初期还是多写写&#xff0c;加深下记忆&#xff09;在这里我就偷个懒&#xff0c;图片涉及到侵权及时&#xff0c;请…...

使用 Git LFS(大文件存储)

Git LFS&#xff08;Large File Storage&#xff09;是一种扩展 Git 的工具&#xff0c;旨在更有效地管理大文件的版本控制。它通过将大文件的内容存储在 Git 之外来解决 Git 在处理大文件时的性能问题。 主要特点 替代存储&#xff1a;Git LFS 不直接将大文件存储在 Git 仓库…...

js 将一维数组转换成树形结构的方法

一维数组的数据结构&#xff0c;如下 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在多线程网页抓取中的应用

网页爬虫作为获取网络数据的重要工具&#xff0c;其效率和性能直接影响到数据获取的速度和质量。Crawler4j作为一个强大的Java库&#xff0c;专门用于网页爬取&#xff0c;提供了丰富的功能来帮助开发者高效地抓取网页内容。本文将探讨如何利用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 合并单元格 合并单元格方式&#xff1a; 目标单元格&#xff1a;(写合并代码) 合并单元…...

C语言数据结构之单向链表(SingleList)

C语言数据结构之单向链表&#xff08;SingleList&#xff09; 自定义结构体数据类型SListNode表示单向链表的节点&#xff0c;成员包括一个无类型的data用来存贮数据和一个SListNode本身类型的指针next&#xff0c;指向下一个节点。围绕SListNode写一系列函数以slist_开头实现…...

【银河麒麟高级服务器操作系统实例】金融行业TCP连接数猛增场景的系统优化

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn 服务器环境以及配置 物理机/虚拟机/云/容器 物理…...

详解Java的类文件结构(.class文件的结构)

this_class 指向常量池中索引为 2 的 CONSTANT_Class_info。super_class 指向常量池中索引为 3 的 CONSTANT_Class_info。由于没有接口&#xff0c;所以 interfaces 的信息为空。 对应 class 文件中的位置如下图所示。 06、字段表 一个类中定义的字段会被存储在字段表&#x…...

爆肝整理14天!AI工具宝藏合集

随着AI技术的飞速发展&#xff0c;各类AI工具如雨后春笋般涌现。经过对上百款AI工具的深入探索与测试&#xff0c;我精心挑选出了一些功能强大的AI神器&#xff0c;这些工具将极大地降低自媒体创作的门槛。 &#x1f680;无论是撰写文案、剪辑视频、设计图文&#xff0c;还是处…...

OpenClaw对接nanobot镜像:低成本实现本地AI助手自动化任务

OpenClaw对接nanobot镜像&#xff1a;低成本实现本地AI助手自动化任务 1. 为什么选择OpenClawnanobot组合 去年夏天&#xff0c;当我第一次尝试用AI自动化处理日常工作时&#xff0c;发现大多数方案要么需要昂贵的云服务API调用&#xff0c;要么对硬件要求极高。直到遇到Open…...

OpenClaw技能分享:GLM-4.7-Flash驱动的邮件自动处理系统

OpenClaw技能分享&#xff1a;GLM-4.7-Flash驱动的邮件自动处理系统 1. 为什么需要自动化邮件处理 每天早晨打开邮箱&#xff0c;看到堆积如山的未读邮件总让人头皮发麻。作为一个小团队的负责人&#xff0c;我经常需要处理客户咨询、内部沟通、会议邀请等各种类型的邮件。最…...

WavePWM库:嵌入式LED正弦调光算法与实现

1. WavePWM库概述&#xff1a;正弦波形LED调光的底层实现原理与工程应用 WavePWM是一个面向嵌入式LED驱动场景的轻量级波形PWM计算库&#xff0c;其核心价值不在于直接控制硬件引脚&#xff0c;而在于 以确定性数学模型生成高保真度的正弦&#xff08;或类正弦/指数&#xff0…...

nli-distilroberta-base代码实例:Python调用DistilRoBERTa实现Entailment识别

nli-distilroberta-base代码实例&#xff1a;Python调用DistilRoBERTa实现Entailment识别 1. 项目概述 自然语言推理(Natural Language Inference, NLI)是自然语言处理中的一项重要任务&#xff0c;用于判断两个句子之间的逻辑关系。nli-distilroberta-base是基于DistilRoBER…...

用51单片机+无源蜂鸣器播放《两只老虎》完整教程(附代码与乐理速成)

用51单片机驱动无源蜂鸣器演奏《两只老虎》全流程解析 第一次听到单片机播放音乐时&#xff0c;那种"机器唱歌"的奇妙感至今难忘。作为电子爱好者入门必备的趣味项目&#xff0c;用蜂鸣器演奏音乐不仅能巩固定时器、中断等核心知识&#xff0c;更能将枯燥的理论转化为…...

经典概率题:飞机座位分配问题(LeetCode 1227)超详细解析

一、题目背景与描述这是一道非常经典的概率与逻辑推理面试题&#xff0c;也是 LeetCode 第 1227 题「飞机座位分配概率」。题目描述有 n 位乘客即将登机&#xff0c;飞机正好有 n 个座位。第一位乘客的票丢了&#xff0c;他随机选一个座位坐下。剩下的乘客&#xff1a;如果自己…...

你用AI写代码时,是不是总觉得“它懂语法,却搞不定真实工程”?Composer 2的答案在这里

很多开发者都有过这种体验&#xff1a;把一个真实项目需求甩给AI&#xff0c;它能秒出语法完美的代码片段&#xff0c;可一到大型代码库、遗留系统、多文件联动的时候&#xff0c;就开始原地打转。改了半天核心逻辑没动&#xff0c;引入新问题&#xff0c;或者干脆在长链条任务…...

LWIP内存管理踩坑实录:从pbuf泄漏到pcb耗尽,我的嵌入式网络调试日记

LWIP内存管理踩坑实录&#xff1a;从pbuf泄漏到pcb耗尽&#xff0c;我的嵌入式网络调试日记 凌晨三点&#xff0c;调试器上的红色LED还在闪烁。这是我连续第三个通宵追踪LWIP的内存问题——设备在运行48小时后必然崩溃&#xff0c;日志里满是"pbuf_alloc failed"和&q…...

3步玩转Balena Etcher:开源镜像烧录工具完全指南

3步玩转Balena Etcher&#xff1a;开源镜像烧录工具完全指南 【免费下载链接】etcher Flash OS images to SD cards & USB drives, safely and easily. 项目地址: https://gitcode.com/GitHub_Trending/et/etcher Balena Etcher是一款开源跨平台镜像烧录工具&#x…...

如何选择适合的单北斗变形监测一体机以提升基础设施安全?

本文将重点讨论如何选择适合的单北斗变形监测一体机&#xff0c;以增强基础设施的安全性。在当前基础设施建设快速发展的背景下&#xff0c;单北斗GNSS的应用显得尤为重要。通过深入理解单北斗变形监测的原理&#xff0c;用户能够更好地把握设备的核心优势&#xff0c;尤其是在…...