《深度学习》【项目】 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 = 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、应用领域

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实习项目|苍穹外卖|day11

Apache ECharts 前端技术。 营业额统计 还是比较简单的。 用户统计 订单统计 以上所有需求。难点在于对时间类的处理&#xff1a; // 接收格式 GetMapping("/turnoverStatistics")ApiOperation("营业额统计")public Result<TurnoverReportVO>…

【每日刷题】Day125

【每日刷题】Day125 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 17. 电话号码的字母组合 - 力扣&#xff08;LeetCode&#xff09; 2. LCR 080. 组合 - 力扣&#…

Linux s3c2440 开发板上的操作系统实现 ubuntu

使用s3c2440开发板 使用ubuntu 1.ubuntu中的tftp&#xff0c;和nfs Trivial File Transfer Protocol,简单文件 传输协议。 通过网络在客户端与服务器之间进行简单文件 传输。提供不复杂、开销不大的文件传输服务。 Network File System&#xff0c;网络文件系统。通过 网络…

JavaSE - 面向对象编程01

01 什么是面向对象编程(oop) 答&#xff1a;就是只关心对象之间的交互&#xff0c;而并不关心任务是怎样具体完成的。例如把一个大象放进冰箱需要几步&#xff1f;如果是面向对象编程只会思考冰箱和大象之间的交互&#xff0c;那么给出的答案就是&#xff1a;把冰箱门打开&…

Radware 报告 Web DDoS 攻击活动

新一代 HTTPS 洪水攻击的频率和强度急剧增加&#xff0c;攻击者引入的复杂程度也在迅速提高。2024 年上半年&#xff0c;Web 分布式拒绝服务 (DDoS) 攻击的频率和强度显著增加。其中很大一部分活动可以归因于受政治紧张局势驱使的黑客活动分子。 众所周知&#xff0c;当今的黑…

Ubuntu22.04系统安装opencv步骤简述及问题解决方法

前言 opencv是一个功能强大、开源且跨平台的计算机视觉库&#xff0c;适用于多种编程语言和操作系统&#xff0c;能够帮助开发者构建各种视觉项目。其模块众多&#xff0c;提供了诸多功能&#xff0c;能够进行图像处理、视频处理等等。比如&#xff1a;Highgui模块提供图像用户…

java开发中间件学习记录(持续更新中~)

1 Redis 2JVM 3 java基础底层 4Mysql 5 spring 6 微服务 7.......(持续更新) One:Redis篇 1:Redis 1.穿透 1.1缓存穿透 1.1.1布隆过滤器 1.2缓存击穿 2&#xff1a;击穿 1.3&#xff1a;缓存雪崩 1.4:双写一致 1.5.持久化&#xff08;RDB,AOF&#xff09; 1.6…

Mastering openFrameworks_第十一章_网络

网络 网络为多个设备之间的数据交换提供了一种方式。它是一个主要组成部分&#xff0c;允许远程控制移动和平板设备应用程序中的一些参数&#xff0c;也用于使交互式项目在多台计算机上同步工作。在本章中&#xff0c;您将学习如何在openFrameworks项目中实现和使用OSC和TCP协…

Go 1.19.4 路径和目录-Day 15

1. 路径介绍 存储设备保存着数据&#xff0c;但是得有一种方便的模式让用户可以定位资源位置&#xff0c;操作系统采用一种路径字符 串的表达方式&#xff0c;这是一棵倒置的层级目录树&#xff0c;从根开始。 相对路径&#xff1a;不是以根目录开始的路径&#xff0c;例如 a/b…

【Qt笔记】QScrollArea控件详解

目录 引言 一、QScrollArea 的基本概念 二、QScrollArea 的主要属性 2.1 设置内容大小是否随滚动区域变化 2.2 设置水平与垂直滚动条 2.3 设置视口外边距 三、QScrollArea 的常用方法 3.1 设置显示小部件 3.2 返回当前设置的小部件 3.3 设置内部小部件是否可以填充…

【bug】通过lora方式微调sdxl inpainting踩坑

报错内容 ValueError: Attempting to unscale FP16 gradients. 报错位置 if accelerator.sync_gradients:params_to_clip (itertools.chain(unet_lora_parameters, text_lora_parameters_one, text_lora_parameters_two)if args.train_text_encoderelse unet_lora_parameters…

ICP算法介绍,机器人姿态估计,三维点云配准

介绍 ICP算法&#xff0c;即Iterative Closest Point&#xff08;迭代最近点&#xff09;算法&#xff0c;是一种广泛应用于计算机视觉和图像处理领域的几何配准算法。它的主要目的是通过最小化两组点集之间的距离来找出一组变换&#xff0c;使得两组点集尽可能地对齐。ICP算法…

37拼购:电商新风尚,共享双赢的购物革命

随着2024年电商市场的日益繁荣&#xff0c;商品海洋中的同质化问题愈发严峻&#xff0c;消费者在茫茫商海中寻觅独特价值的难度陡增。在此背景下&#xff0c;一种名为“37悦享拼”的创新电商模式横空出世&#xff0c;它巧妙融合了私域社交与电商精髓&#xff0c;旨在打破传统壁…

9.18作业

提示并输入一个字符串&#xff0c;统计该字符串中字母、数字、空格、其他字符的个数并输出 代码展示 #include <iostream>using namespace std;int main() {string str;int countc 0; // 字母计数int countn 0; // 数字计数int count 0; // 空格计数int counto 0;…

部署自己的对话大模型,使用Ollama + Qwen2 +FastGPT 实现

部署资源 AUTODL 使用最小3080Ti 资源&#xff0c;cuda > 12.0使用云服务器&#xff0c;部署fastGPT oneAPI&#xff0c;M3E 模型 操作步骤 配置代理 export HF_ENDPOINThttps://hf-mirror.com下载qwen2模型 - 如何下载huggingface huggingface-cli download Qwen/Qwen2-…

Java | Leetcode Java题解之第402题移掉K位数字

题目&#xff1a; 题解&#xff1a; class Solution {public String removeKdigits(String num, int k) {Deque<Character> deque new LinkedList<Character>();int length num.length();for (int i 0; i < length; i) {char digit num.charAt(i);while (!…

ERP进销存管理系统的业务全流程 Axure高保真原型源文件分享

这是一套ERP进销存管理系统的业务全流程Axure高保真原型设计文档。 原型预览地址&#xff1a;https://ppndif.axshare.com 产品意义&#xff1a; 提高工作效率&#xff1a; 电子记账替代手工记账&#xff0c;减少工作负担和人为错误。 实时查看库存情况&#xff0c;减少盘点时…

MySQL常用语句(一)

#数据库操作思路 #相关实验 <SQL语句简介> <web安全SQL语句基本操作> #数据库管理 #创建数据库 在与数据进行任何操作之前&#xff0c;需要创建一个数据库。数据库是数据的容器&#xff0c;用于存储和操作诸如表、数据库视图、触发器、存储过程等数据的数据集…

项目管理 | 一文读懂什么是敏捷开发管理

在快速变化的商业环境中&#xff0c;项目管理方式也在不断演进&#xff0c;其中敏捷开发管理因其高效、灵活和适应性强的特点&#xff0c;逐渐成为众多企业和团队的首选。本文将详细解析敏捷开发管理的定义、具体内容及其核心角色&#xff0c;帮助读者全面理解这一先进的项目管…

Alinx MPSoC驱动开发第17章I2C实验修改设备树后petalinux编译报错

问题描述 在使用Alinx的MPSoC Linux驱动开发手册第17章进行I2C驱动学习时&#xff0c;在按照手册&#xff0c;在system-user.dtsi文件最后添加引用i2c1节点内容&#xff1a; 然后使用petalinux-build命令进行编译&#xff0c;后报错如下&#xff1a; 尝试解决问题 1&#xff0c…