《深度学习》【项目】 OpenCV 身份证号识别

news2024/11/24 12:12:22

目录

一、项目实施

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 = 0
    if method == 'right-to-left' or method == 'bottom-to-top':  # 判断排序方式,以此来更改reverse
        reverse=True
    if method == 'top-to-bottom' or method == 'bottom-to-top':
        i = 1
    boundingBoxes = [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变成255
    cv_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 np

output = []
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、在图像识别任务中,通常包括以下几个步骤:

  1. 数据收集:收集大量的带有标注的图像数据,用于模型训练和测试。

  2. 数据预处理:对收集到的图像数据进行预处理,例如图像增强、尺寸调整、灰度化等。

  3. 特征提取:提取图像中的特征信息,常用的特征提取方法包括传统的基于手工设计特征的方法和基于深度学习的方法。

  4. 模型训练:使用标注好的图像数据和提取到的特征信息,训练图像识别模型,常用的深度学习模型包括卷积神经网络(CNN)、循环神经网络(RNN)等。

  5. 模型优化:对训练好的模型进行优化,主要包括模型参数调整、超参数调整等。

  6. 模型评估:使用测试集进行模型评估,评估指标包括准确率、召回率、精确率等。

  7. 预测和应用:使用训练好的模型进行图像识别预测,并将识别结果应用到实际场景中。

3、应用领域

        图像识别技术的应用非常广泛,例如人脸识别技术可以应用于安全领域、物体检测技术可以应用于智能交通领域等。随着深度学习等技术的发展,图像识别技术的准确性和效果也有了很大的提升。但是,图像识别任务仍然面临着一些挑战和问题,例如对于复杂的场景和模糊的图像可能会有较低的准确率,对于大规模数据的处理和模型的训练也需要较大的计算资源和时间。

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

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

相关文章

【VScode】配置多账户连接远程服务器

1、下载VSCODE&#xff0c;安装Remote-SSH插件 需要安装Remote-SSH插件和python插件。 2、添加服务器连接配置 这种登录的用户就是user2用户。如果想要登录其他用户&#xff0c;那么就在C:\Users\user.ssh\config文件中将其他用户的信息放在最顶端即可 3、测试链接&#xff0…

mysql的zip解压缩版安装

文章目录 一、MySQL下载二、mysql解压缩版安装1、解压缩2、设置环境变量3、mysql初始化4、安装mysql服务5、启动mysql服务6、连接mysql7、修改初始密码8、安装完成 一、MySQL下载 下载网址&#xff1a;MySQL下载 本文以mysql8.4.2版本为例下载解压缩版。 二、mysql解压缩版安…

JAVA毕业设计172—基于Java+Springboot+vue的智能景区旅游规划管理系统(源代码+数据库)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvue的智能景区旅游规划管理系统(源代码数据库)172 一、系统介绍 本项目前后端分离(可以改为ssm版本)&#xff0c;分为用户、管理员两种角色 1、用户&#xff1…

即插即用篇 | YOLOv8 引入维度互补注意力混合Transformer模块 | 轻量级互补注意力网络:RAMiT引领图像修复新突破

本改进已同步到YOLO-Magic框架! 摘要:虽然许多近期的研究在图像修复(IR)领域取得了进展,但它们通常存在参数数量过多的问题。另一个问题是,大多数基于Transformer的图像修复方法只关注局部或全局特征,导致感受野有限或参数不足的问题。为了解决这些问题,我们提出了一种…

记忆宫殿 v1.2.10 最强大脑训练,有效提升记忆力

记忆宫殿 v1.2.10 是一款非常实用的记忆力训练工具&#xff0c;可以帮助您提高记忆力。尽管界面设计较为简单&#xff0c;但它包含了各种科学的记忆理论和专业的训练方法&#xff0c;如瞬间记忆、短时记忆、机械记忆、配对联想、电话簿和车牌识记等。这些训练项目有助于提升您的…

WebGL系列教程六(纹理映射与立方体贴图)

目录 1 前言2 思考题3 纹理映射介绍4 怎么映射&#xff1f;5 开始绘制5.1 声明顶点着色器和片元着色器5.2 修改顶点的颜色为纹理坐标5.3 指定顶点位置和纹理坐标的值5.4 获取图片成功后进行绘制5.5 效果5.6 完整代码 6 总结 1 前言 上一讲我们讲了如何使用索引绘制彩色立方体&a…

牛客小白月赛99(上)

材料打印 题目描述 登录—专业IT笔试面试备考平台_牛客网 运行代码 #include<iostream> using namespace std; int main(){int T;cin>>T;while(T--){ long long int a,b,x,y;cin>>a>>b>>x>>y;if(x<y){cout<<a*xb*y<<end…

微软数据库的SQL注入漏洞解析——Microsoft Access、SQLServer与SQL注入防御

说明:本文仅是用于学习分析自己搭建的SQL漏洞内容和原理,请勿用在非法途径上,违者后果自负,与笔者无关;本文开始前请认真详细学习《‌中华人民共和国网络安全法》‌及其相关法规内容【学法时习之丨网络安全在身边一图了解网络安全法_中央网络安全和信息化委员会办公室】 。…

Luigi:一个强大的Python模块,构建复杂的批处理作业管道的高效工具

在现代数据处理的大潮中&#xff0c;构建和管理复杂的数据管道是极其重要的一环。Luigi&#xff0c;作为一个强大的Python模块&#xff0c;为用户提供了构建复杂的批处理作业管道的高效工具。它不仅能够处理依赖关系、工作流管理、可视化等功能&#xff0c;还内置对Hadoop的支持…

架构与业务的一致性应用:实现企业战略目标和合规管理的全面指南

在当今快速变化的数字经济中&#xff0c;信息架构已成为企业实现其业务目标、优化运营效率和确保数据安全的关键工具。 一个成功的信息架构不仅要与企业的战略目标紧密对齐&#xff0c;还必须遵循日益严格的合规性要求&#xff0c;以保护敏感数据并满足法规规定。《信息架构&a…

Django 创建好的模块怎么在后台显示

1、配置模型及其需要显示的数据 刚才创建好的tests的增删改查&#xff0c;在后台是不显示的&#xff0c;所以需要进行配置,在刚才创建好的模块里找到admin.py文件&#xff0c;在里面进行如下配置 from django.contrib import adminfrom . import models from .models import …

【多线程】深入剖析定时器的应用

&#x1f490;个人主页&#xff1a;初晴~ &#x1f4da;相关专栏&#xff1a;多线程 / javaEE初阶 在软件开发中&#xff0c;有一些代码逻辑并不需要立马就被执行&#xff0c;可能需要等一段时间在执行。就好像我们会用闹钟来提醒我们过一段时间后要做某事一样&#xff0c;代码…

电脑文件怎么加密?文件加密方法介绍

随着数字化时代的到来&#xff0c;电脑文件的安全性问题日益凸显。为了保护个人隐私和企业数据&#xff0c;文件加密成为了一项重要的安全措施。本文将详细介绍几种常见的电脑文件加密方法&#xff0c;帮助你更好地保护自己的数据安全。 超级加密3000 超级加密3000提供了两种主…

哪款骨传导耳机适合运动?健身党无广安利五款有用的骨传导耳机!

作为一名耳机爱好者&#xff0c;我的耳机收藏可以说是丰富多样&#xff0c;从追求极致音质的头戴式&#xff0c;到便于携带的入耳式&#xff0c;再到近年来兴起的骨传导耳机&#xff0c;我都有所体验。在众多选择中&#xff0c;我最终偏爱上了骨传导耳机&#xff0c;它以其独特…

【Cadence26】无原理图直接绘制PCB项目的问题总结

【转载】Cadence Design Entry HDL 使用教程 【Cadence01】Cadence PCB Edit相对延迟与绝对延迟的显示问题 【Cadence02】Allegro引脚焊盘Pin设置为透明 【Cadence03】cadence不小心删掉钢网层怎么办&#xff1f; 【Cadence04】一般情况下Allegro PCB设计时的约束规则设置&a…

I-RNTI是什么?

I-RNTI是Inactive RNTI的缩写&#xff0c;它是per RNA配置的一个参数, 主要作用就是UE在RRCResume的时候, 方便new gNB去获取UE之前的锚点gNB(从而获取UE上下文)。 在R2-1812504中有关I-RNTI的agreement如上图&#xff1a; 1 gNB 在suspend消息中为 UE 配置full I-RNTI 和shor…

AI网盘搜索 1.2.6 智能文件搜索助手,一键搜索所有资源

对于经常需要处理大量文件的人来说&#xff0c;AI网盘检索简直是救星。它提供了智能对话式搜索功能&#xff0c;只需用自然语言描述就能找到需要的文件。此外&#xff0c;它还广泛支持各种文件类型&#xff0c;从文档到图片&#xff0c;全面覆盖。精准定位功能让您能够快速找到…

在对接电影票API时如何快速进行错误处理和调试

在对接电影票API时&#xff0c;进行有效的错误处理和调试是确保用户体验和系统稳定性的关键。以下是一些步骤和建议&#xff1a; 1.阅读API文档&#xff1a; 在开始对接前&#xff0c;彻底理解API文档中关于错误处理的部分&#xff0c;了解可能返回的所有错误码和它们的含义。…

微信小程序 === 长列表性能优化

目录 怎么做到的&#xff1f; 环境准备 使用开发者工具调试 开始迁移 在真机上预览效果 配置 We 分析 AB 实验 快捷切换入口 如何识别当前页面是否使用 Skyline 滚动容器及其应用场景 长列表 ScrollView 的三种模式 列表模式 自定义模式 嵌套模式 可拖拽容器 对…

启明云端乐鑫代理商,乐鑫ESP32无线芯片方案,物联网设备WiFi联动控制

随着智能和远程技术的飞速发展&#xff0c;物联网(IoT)逐渐出现在我们生活的每一个角落。乐鑫以其创新的无线通信技术&#xff0c;正成为智能家居、工业自动化和医疗设备等领域的推动者。 无线WiFi芯片模组不仅提供了强大的数据处理能力&#xff0c;还赋予了设备以直观的交互方…