《深度学习》【项目】 OpenCV 身份证号识别
目录
一、项目实施
1、自定义函数
2、定位模版图像中的数字
1)模版图二值化处理
运行结果:
2)展示所有数字
运行结果:
3、识别身份证号
1)灰度图、二值化图展示
运行结果
2)定位身份证号每一个数字
运行结果:
3)取出身份证号每一个数字
运行结果:
4)使用模板匹配计算匹配得分
运行结果:
二、总结
1、关于图像识别
2、在图像识别任务中,通常包括以下几个步骤:
3、应用领域
一、项目实施
1、自定义函数
用于展示图像以及获取输入的轮廓图像的排序结果和边界信息
def cv_show(name, image): # 输入两个参数,图像名和图像地址即可展示图像cv2.imshow(name, image)cv2.waitKey(0)import cv2
def sort_contours(cnts ,method='left-to-right'): # 输入参数轮廓列表,以及method,默认排序方式为由左到右reverse = False # 布尔值,用于控制排序的方向i = 0if method == 'right-to-left' or method == 'bottom-to-top': # 判断排序方式,以此来更改reversereverse=Trueif method == 'top-to-bottom' or method == 'bottom-to-top':i = 1boundingBoxes = [cv2.boundingRect(c) for c in cnts] # 遍历每一个轮廓图,取出轮廓图的x、y、w、h,将这些信息存放到空列表中# 将列表轮廓和轮廓信息组合成一个元组的列表,再通过匿名函数排序这个元组列表,排序依据为轮廓数据的第一位x大小,降序方式,返回两个元素,一个是排序后的轮廓列表,一个是轮廓的边界框(cnts,boundingBoxes) = zip(*sorted(zip(cnts,boundingBoxes),key=lambda b:b[1][i],reverse=reverse))return cnts,boundingBoxes
2、定位模版图像中的数字
1)模版图二值化处理
img = cv2.imread("shuzi.png") # 导入模版图像
cv_show('img', img) # 展示原图
gray = cv2.imread("shuzi.png", 0) # 读取模版图的灰度图
ref = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY_INV)[1] # 对灰度图进行二值化处理,灰度值大于150的将其改变为255,小于150的改变为0
cv_show('ref', ref) # 展示二值化图像
运行结果:
2)展示所有数字
# 计算轮廓: cv2.findContours()数接受的参数为二值图,即黑白的(不是灰度图)
# cv2.RETR_EXTERNAL 只检测外轮廓,cv2.CHAIN_APPRO_SIMPLE只保留端点坐标
_,refCnts, hierarchy = cv2.findContours(ref.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, refCnts, -1, (0, 255, 0), 2) # 绘制轮廓
cv_show('img', img)
#
refCnts = sort_contours(refCnts, method='left-to-right')[0] # 调用自定义函数,对轮廓图像进行排序,返回排序后图片以及轮廓的边界信息(x,y,w,h)
# 保在模板中每个数字对应的像素值
digits = {}
for (i, c) in enumerate(refCnts): # 使用函数enumerate返回可迭代器的索引和其对应的值(x, y, w, h) = cv2.boundingRect(c) # 计算轮廓的外接矩形,返回矩形的边界信息roi = ref[y - 2 : y + h + 2, x - 2 : x + w + 2] # 裁剪出每个数字对应的图像roi = cv2.resize(roi, (57, 88)) # 将裁剪出来的图像进行缩放,尺寸变成(57,88)roi = cv2.bitwise_not(roi) # 对每个数字进行按位取反运算,即灰度值255变成0,0变成255cv_show('roi',roi) # 展示取反后的图像digits[i] = roi # 将每个轮廓存入字典
cv2.destroyAllWindows() # 关闭所有图像
运行结果:
3、识别身份证号
1)灰度图、二值化图展示
img = cv2.imread('./shenfen.jpg')
imgg=img.copy()
cv_show('img', img)gray = cv2.imread('./shenfen.jpg', 0) # 灰度图
cv_show('gray', gray)ref = cv2.threshold(gray, 120, 255, cv2.THRESH_BINARY_INV)[1] # 二值化
cv_show('ref', ref)
运行结果
2)定位身份证号每一个数字
# # 计算轮廓: cv2.findContours()数接受的参数为二值图,即黑白的(不是灰度图)
# # CV2.RETR_EXTERNAL 只检测外轮廓,CV2.CHAIN_APPROX_SIMPLE只保留端点坐标
_,refCnts, hierarchy = cv2.findContours(ref.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 识别身份证图片所有轮廓
a = cv2.drawContours(img.copy(), refCnts, -1, (0, 255, 0), 2) # 绘制轮廓
cv_show('img', a)
#
# cv2.destroyAllWindows()
#
# # 遍历轮廓,找到数字部分像素区城
locs = []
for (i, c) in enumerate(refCnts): # 遍历每一个轮廓及其对应索引(x, y, w, h) = cv2.boundingRect(c) # 计算外接矩形边界信息# 选择合适的区域,根据实际任务来if (y > 330 and y < 360) and x > 220: # 判断轮廓的坐标位置,留下身份证号位置的信息,此处位置信息需要自己结合原图像素值进行判断locs.append((x, y, w, h)) # 满足上述条件的为身份证号每一个数字的轮廓locs = sorted(locs, key=lambda x: x[0]) # 对身份证号按照x的值进行进行排序
运行结果:
3)取出身份证号每一个数字
import numpy as npoutput = []
for (i, (gX, gY, gW, gH)) in enumerate(locs): # 遍历每一个数字的边界信息及其对应的索引groupOutput = []group = gray[gY - 2 : gY + gH + 2, gX - 2 : gX + gW + 2] # 对每个数字的轮廓适当加一点边界,gray为上述的身份证灰度图cv_show('group',group) # 绘制边界# 预处理group = cv2.threshold(group, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1] # 二值化每个数字的轮廓图cv_show('group',group)roi = cv2.resize(group, (57, 88)) # 对每个数字做缩放处理cv_show('roi',roi)
运行结果:
4)使用模板匹配计算匹配得分
scores = []# 在模板中计算每一个得分for (digit, digitROI) in digits.items(): # 遍历每一个数字模版及其对应的数值# 模板匹配result = cv2.matchTemplate(roi, digitROI, cv2.TM_CCOEFF) # 对上述识别出来的身份证号图与数字模版进行匹配(_, score, _, _) = cv2.minMaxLoc(result) # # 找到上述模板匹配相关系数最大值,只要score,其他返回值忽略scores.append(score) # 将最大值增加到列表# 得到最合适的数字groupOutput.append(str(np.argmax(scores))) # 取出最大值对应的数字存入列表# 绘制每个数字的矩形边框cv2.rectangle(imgg, (gX - 5, gY - 5), (gX + gW + 5, gY + gH + 5), (0, 0, 255), 1)# cv2.putText()是OpenCV库中的一个函数,用于在图像上添加文本。cv2.putText(imgg, "".join(groupOutput), (gX, gY - 15), cv2.FONT_HERSHEY_SIMPLEX, 0.65, (0, 0, 255), 2)output.extend(groupOutput) # 得到结果
#
# 打印结果
print("Card ID #: {}".format("".join(output)))
cv2.imshow("Image", imgg)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果:
二、总结
1、关于图像识别
图像识别是计算机视觉领域中的一个重要任务,其目标是让计算机能够理解和解释图像中的内容以及进行自动化的图像分析和处理。图像识别技术可以应用于很多领域,例如人脸识别、物体检测、车牌识别等。
2、在图像识别任务中,通常包括以下几个步骤:
-
数据收集:收集大量的带有标注的图像数据,用于模型训练和测试。
-
数据预处理:对收集到的图像数据进行预处理,例如图像增强、尺寸调整、灰度化等。
-
特征提取:提取图像中的特征信息,常用的特征提取方法包括传统的基于手工设计特征的方法和基于深度学习的方法。
-
模型训练:使用标注好的图像数据和提取到的特征信息,训练图像识别模型,常用的深度学习模型包括卷积神经网络(CNN)、循环神经网络(RNN)等。
-
模型优化:对训练好的模型进行优化,主要包括模型参数调整、超参数调整等。
-
模型评估:使用测试集进行模型评估,评估指标包括准确率、召回率、精确率等。
-
预测和应用:使用训练好的模型进行图像识别预测,并将识别结果应用到实际场景中。
3、应用领域
图像识别技术的应用非常广泛,例如人脸识别技术可以应用于安全领域、物体检测技术可以应用于智能交通领域等。随着深度学习等技术的发展,图像识别技术的准确性和效果也有了很大的提升。但是,图像识别任务仍然面临着一些挑战和问题,例如对于复杂的场景和模糊的图像可能会有较低的准确率,对于大规模数据的处理和模型的训练也需要较大的计算资源和时间。
相关文章:

《深度学习》【项目】 OpenCV 身份证号识别
目录 一、项目实施 1、自定义函数 2、定位模版图像中的数字 1)模版图二值化处理 运行结果: 2)展示所有数字 运行结果: 3、识别身份证号 1)灰度图、二值化图展示 运行结果 2)定位身份证号每一个数…...
机器学习实战—天猫用户重复购买预测
目录 背景 数据集 用户画像数据 用户行为日志数据 训练数据 测试数据 提交数据 其它数据 数据探索 导入依赖库 读取数据 查看数据信息 缺失值分析 数据分布 复购因素分析 特征工程 模型训练 模型验证 背景 商家有时会在特定日期,例如节礼日(Boxing-day),黑…...

一款rust语言AI神器cursor在ubuntu环境下的安装启动教程
虽然cursor目前只支持英文但是它强大的代码联想能力以及问答能力,可以高效的提高编码效率。 如下步骤所有的前提是你的ubuntu上面已经安装了vscode以及其必须的extensions。 1 下载 到官网https://www.cursor.com下载指定版本的软件。 下载到本地以后会生成如下软…...
【C#生态园】发现C#中的数据科学魔法:6款不可错过的库详解
探索C#中的数据科学与机器学习:6个强大库解析 前言 在数据科学和机器学习领域,Python一直占据着主导地位,然而对于习惯使用C#编程语言的开发人员来说,寻找适用于C#的数据科学库一直是一个挑战。本文将介绍几个流行的用于C#的数据…...
导入neo4j数据CSV文件及csv整理demo示例
Neo4j导入CSV文件(实体和关系)_neo4j导入csv关系-CSDN博客 https://blog.csdn.net/m0_69483514/article/details/131296060?spm1001.2101.3001.6661.1&utm_mediumdistribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ER…...
bug | pycharm社区版无sciview解决办法
一个程序运行多个图,plt.show()一次只弹出一个独立窗口,必须关掉一个才能显示下一张图,想找sciview却发现找不到,本来以为是新版pycharm的问题,后来才发现是community版根本没有sciview…不想换专业版了,研…...
PL/SQL程序设计入门
PL/SQL程序设计 PL/SQL起步鼻祖:hello World语法分析声明部分举例 应用举例 PL/SQL 起步鼻祖:hello World 先举个例子,用PL/SQL打印输出hello world declarev_string varchar2(20); beginv_string:hello world;dbms_output.put_line(v_str…...
一、Numpy入门
Numpy入门 前言一、numpy简介二、Numpy的ndarray属性2.1. 直接用 .属性的方法实现2.2. 直接函数的方法实现 三、Numpy的ndarray的创建3.1. ndarray介绍3.2. 数组形式3.3. zeros()、ones() 、 empty()3.4. arange(),类似 python 的 range() ,创建一个一维…...

自动化测试框架设计核心理念——关键字驱动
很多人在接触自动化测试时,都会听到关键字驱动这样的一个概念,但是在研究时却有些不太清楚这种驱动模式的设计及实现到底该如何着手去做。 关键字驱动,作为一种自动化测试框架的设计形式,在很早的时候就已经有提及过了。它的基本…...
GO GIN SSE DEMO
文章目录 接口描述:1.1 /events/time - 时间流1.2 /events/numbers - 数字流 2. 用户管理接口2.1 /user/:id - 获取用户信息2.2 /user - 创建用户 项目结构1. main.go2. 创建 handlers/event_time.go3. 创建 handlers/event_number.go4. handlers/user.go5. 运行服务…...
GEE教程:1950-2023年ECMWF数据中积雪的长时序统计分析
目录 简介 数据 函数 millis() Arguments: Returns: Long 代码 结果 简介 1950-2023年ECMWF数据中积雪的长时序统计分析 数据 ECMWF/ERA5_LAND/DAILY_AGGR是由欧洲中期天气预报中心(ECMWF)提供的数据集。它是一个格网数据集,包含从ERA5-Land再分析数据集中得出的…...
【React Native】路由和导航
RN 中的路由是通过 React Navigation 组件来完成的 Stack 路由导航RN 中默认没有类似浏览器的 history 对象在 RN 中路由跳转之前,需要先将路由声明在 Stack 中<Stack.Navigator initialRouteNameDetails> <Stack.Screen nameDetails /> </Stack.N…...

Linux环境基础开发工具---vim
1.快速的介绍一下vim vim是一款多模式的编辑器,里面有很多子命令,来实现代码编写操作。 2.vim的模式 vim一共有三种模式:底行模式,命令模式,插入模式。 2.1vim模式之间的切换 2.2 谈论常见的模式---命令模式…...

python AssertionError: Torch not compiled with CUDA enabled
查看:torch import torch# 输出带CPU,表示torch是CPU版本的 print(ftorch的版本是:{torch.__version__}) # print(ftorch是否能使用cuda:{torch.cuda.is_available()}) 修改一下代码,将cuda改成cpu 最后运行正常&…...

Pandas的入门操作-Series对象
Pandas的数据结构 Series对象 class pandas.Series(dataNone, indexNone) data参数 含义:data是Series构造函数中最主要的参数,它用来指定要存储在Series中的数据。 数据类型:data可以是多种数据类型,例如: Python 列…...

自然语言处理系列六十八》搜索引擎项目实战》搜索引擎系统架构设计
注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】 文章目录 自然语言处理系列六十八搜索引擎项目实战》搜索引擎系统架构设计…...
H5依赖安装
依赖安装 git和sourceTree编辑器使用vscode下载nvm 和nodejs git和sourceTree 使用 ssh-keygen -t rsa 进行密钥获取 git下载地址:https://git-scm.com/ sourceTree下载地址:https://www.sourcetreeapp.com/ 编辑器使用vscode 最新版网址:…...
MatchRFG:引领MemeCoin潮流,探索无限增长潜力
Meme币无疑是本轮牛市最热闹的赛道,而围绕Meme币的讨论话题基本都集中在价格炒作上。似乎人们习惯性地认为,Meme币的创造和成长往往与真正的价值无关。热炒过后,价格能否通过共识转化为价值,也正是许多Meme币在热潮冷却后的主要成…...

2024/9/18 模型的存储与读取
一、模型的存储与读取 主要涉及到torch.save和torch.load函数 新建两个python文件: 1.在model_save文件中保存模型(方式一)和模型参数(方式二) 2.在model_load文件中读取模型(方式一)和模型参数并装载模型(方式二)...
在 fnOS上安装 KVM 虚拟化,并使用 Cockpit 网页管理虚拟机
在fnOS系统上安装 KVM 虚拟化,并使用 Cockpit 进行网页管理,可以按照以下步骤进行: 1. 安装 KVM虚拟化组件 首先,更新软件列表和系统包: sudo apt update && sudo apt upgrade -y 安装 KVM 及相关工具软件&…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...

FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...