《深度学习》OpenCV 指纹验证、识别

目录

一、指纹验证

1、什么是指纹验证

2、步骤

1)图像采集

2)图像预处理

3)特征提取

4)特征匹配

5)相似度比较

6)结果输出

二、案例实现

1、完整代码

2、实现结果

调试模式:

三、指纹识别案例

1、展示指纹库图片

2、待验证指纹图

3、看完整代码

运行结果:


一、指纹验证

1、什么是指纹验证

        在OpenCV中,指纹验证是一种图像处理技术,用于识别和验证人类指纹。指纹是一种独特的生物特征,每个人的指纹都具有独特的纹路和图案。指纹验证使用这些独特的特征来确认一个人的身份。

        指纹验证主要包括两个步骤:指纹图像的提取指纹图像的匹配。

        在指纹图像提取阶段,OpenCV会处理输入的图像,通过一系列的图像处理特征提取算法,提取出指纹图像中的纹路和图案

        在指纹图像匹配阶段,OpenCV会将提取的指纹图像与一个或多个预先存储的指纹模板进行比对。比对过程中,OpenCV会计算两幅指纹图像之间的相似度,并根据相似度的阈值进行判断。

        如果两幅指纹图像的相似度超过了设定的阈值,OpenCV将判断它们属于同一个人,否则判断它们属于不同的人。指纹验证可以应用于许多领域,如安全系统、身份识别和刑事调查等。

2、步骤

        1)图像采集

                通过摄像头或扫描仪等设备获取人的手指指纹图像。

        2)图像预处理

                对采集到的指纹图像进行预处理,包括图像增强、去噪、增强对比度等操作,以便更好地提取指纹特征。

        3)特征提取

                在预处理后的图像中提取指纹的特征,常用的方法包括细化、方向计算、特征点定位等。

        4)特征匹配

                将提取的指纹特征与预先存储的指纹模板进行匹配。匹配算法可以使用比对指纹特征向量之间的相似度,如欧氏距离、汉明距离等。

        5)相似度比较

                根据匹配得到的相似度进行比较,判断两幅指纹图像是否属于同一个人。可以根据设定的阈值进行判断,超过阈值则认为匹配成功,否则认为匹配失败。

        6)结果输出

                根据匹配结果输出验证结果,可以是通过图像显示、文本信息或其他方式进行输出。

二、案例实现

1、完整代码

import cv2
def cv_show(name, img):cv2.imshow(name,img)cv2.waitKey(0)def verification(src,model):   # 判断src图与模版图片model一致性# 创建SIFT特征提取器sift = cv2.SIFT_create()kp1,des1 = sift.detectAndCompute(src,None)  # 输入参数为图片、掩码图像,返回图片src的关键点坐标与关键点描述符kp2,des2 = sift.detectAndCompute(model, None)  # 计算模版图片的关键点和描述符# 创建FLANN匹配器,FLANN是一个高效的算法,用于在大规模数据集中执行最近邻搜索flann = cv2.FlannBasedMatcher()# 使用k近邻匹配(des1中的每个描述符与des2中的最近两个描述符进行匹配)# 对des1中的每个描述符在des2中查找两个最近邻matches = flann.knnMatch(des1,des2,k=2)   # 对待验证图与模版图进行匹配,返回匹配成功的点之间的欧式距离、测试图像的索引、样本图像的索引# distance:匹配的特征点描述符的欧式距离,数值越小也就说明俩个特征点越相近。
# queryIdx:测试图像的特征点描述符的下标(第几个特征点描述符),同时也是描述符对应特征点的下标。
# trainIdx:样本图像的特征点描述符下标,同时也是描述符对应特征点的下标。# 进行比较筛选ok = []   # 存放匹配成功的点的坐标for m,n in matches:   # 遍历匹配成功点对应的两组欧氏距离,m为最近的一对点,n为次近的一对点# 根据lowe's比率测试,选择最佳匹配if m.distance < 0.8 * n.distance:  # 判断如果最近的比上次近的大小小于0.8,那么认为这是个正确的匹配ok.append(m)   # 将正确匹配的点存入列表# 统计逋过筛选的匹配数量num = len(ok)if num >= 500:   # 判断如果匹配数量大于500,则认为匹配成功result = "认证通过"else:result = "认证失败"return resultif __name__ == '__main__':src1 = cv2.imread("src1.BMP")   # 导入待验证图cv_show('src1', src1)src2 = cv2.imread("src2.BMP")cv_show('src2', src2)model = cv2.imread("model.BMP")   # 导入模版图cv_show('model',model)result1 = verification(src1,model)   # 放入函数进行判断result2 = verification(src2,model)print('src1验证结果为:',result1)print('src2验证结果为:',result2)

2、实现结果

调试模式:

三、指纹识别案例

1、展示指纹库图片

2、待验证指纹图

3、看完整代码

import reimport cv2
import numpy as np
import sys
import osdef getNum(src, model):  # 输入待验证图与模版图img1 = cv2.imread(src)img2 = cv2.imread(model)sift = cv2.SIFT_create()  # 创建sift特征提取器kp1,des1 = sift.detectAndCompute(img1, None)   # 提取待验证图片和模版图的关键点和描述符信息kp2,des2 = sift.detectAndCompute(img2, None)flann = cv2.FlannBasedMatcher()   # 建立Flann匹配器,其用来匹配大规模数据速度快matches = flann.knnMatch(des1,des2,k=2)   # 使用匹配器的K近邻算法匹配待匹配图片与模版图片,匹配两个最近距离ok = []for m,n in matches:   # 判断距离比例值是否小于0.8,是则将这一对点存入列表if m.distance < 0.8 *n.distance:ok.append(m)num = len(ok)    # 返回匹配成功的匹配数目return num"""获取指纹编号"""def getID(src, database):max = 0for file in os.listdir(database):  # 使用os.listdir读取database文件夹内的每一个文件model = os.path.join(database, file)   # 智能的将database的路径和file的路径结合成一个新的路径num = getNum(src,model)   # 将待验证图片src与提取出来的模版图model放入函数进行匹配,返回匹配成功的点的对数print("文件名:",file,"匹配数:",num)if num > max:  # 判断匹配成功的个数并不断更新max的值max = num   # 如果遇到最大匹配个数,那么将这个个数更新到max值,然后再更新模版图片的地址name = fileID = re.match(r'^(\d+)?\.([\S\s]+)$',name)[1]  # 正则匹配模版图片的文件名前缀if max < 100:   # src图片不一定是库里面人的指纹,判断匹配成功的数量是否小于100,小于则说明库里没有对应的指纹ID = 9999return ID   # 返回对应的图片名称"""根据指纹编号,获取对应姓名"""
def getName(ID):nameID = {0:'张三',1:'李四',2:'王五',3:'赵六',4:'朱老七',5:'钱八',6:'曹九',7:'王二麻子',8:'andy',9:'Anna',9999:"没找到"}name = nameID.get(int(ID))return name"""主函数"""
if __name__ == '__main__':src = "src.BMP"database = "database"ID = getID(src, database)name = getName(ID)   # 将得到的ID导入函数判断待验证指纹的人的姓名print("识别结果为:",name)
        运行结果:

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

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

相关文章

基于Hadoop的微博舆情监测分析系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

Python并发之道:解锁`concurrent.futures`模块的秘密

引言 concurrent.futures模块是Python标准库的一部分&#xff0c;它提供了高层次的接口来执行异步操作。与传统的多线程或多进程编程相比&#xff0c;使用concurrent.futures可以更加简单、高效地管理并行任务。无论是对于初学者还是有经验的开发者来说&#xff0c;掌握这个模…

传统操作系统和分布式操作系统的区别

分布式操作系统和传统操作系统之间的区别&#xff0c;根植于它们各自的设计哲学和目标。要理解这些差异&#xff0c;需要从操作系统的基本定义、结构、功能以及它们在不同计算环境中的表现进行分析。每种系统都试图解决特定的计算挑战&#xff0c;因此在不同的使用场景下具有各…

C++的6种构造函数

在 C 中&#xff0c;构造函数是一种特殊的成员函数&#xff0c;用于初始化类对象。在对象创建时自动调用&#xff0c;构造函数的主要作用是分配资源、初始化数据成员等。根据不同的功能和使用场景&#xff0c;C 提供了多种类型的构造函数&#xff1a; 1. 默认构造函数 (Defaul…

【MySQL】视图、用户和权限管理

目录 视图创建视图数据修改影响删除视图视图优点 用户和权限管理查看当前的数据库拥有用户信息创建用户修改密码删除用户权限授权回收权限 视图 视图就是相当于创建一个表&#xff0c;将查询到的结果集给存储起来。像使用复杂的多表查询查询到的结果集就不可以对结果集操作。而…

揭秘网络钓鱼:如何识破并防范这场数字时代的诈骗游戏

网络钓鱼是一种网络攻击&#xff0c;它利用伪装的电子邮件欺骗收件人提供信息、下载恶意软件或采取其他期望的行动。 网络钓鱼是网络害虫&#xff0c;自20世纪90年代初从暗网出现以来&#xff0c;至今仍危害全球。根据SlashNext的报告&#xff0c;2023年平均每天有31,000次网络…

SpringCloud 2023 LoadBalancer介绍、使用、获取服务列表原理、负载均衡算法

目录 1. 介绍2. 使用3 获取服务列表原理4. 负载均衡算法 1. 介绍 功能: 提供客户端的负载均衡算法&#xff0c;将请求均摊到多个服务器上。属于客户端负载均衡(Nginx属于服务端负载均衡)&#xff0c;会将服务列表缓存到JVM本地&#xff0c;然后客户端自己选择请求服务器支持S…

头戴式耳机性价比排名怎样?头戴式耳机性价比之王推荐!

在音频设备日益普及的今天&#xff0c;头戴式耳机因其出色的音质和舒适的佩戴体验&#xff0c;成为了许多音乐爱好者和游戏玩家的首选。然而&#xff0c;很多人比较关心的是头戴式耳机性价比排名怎样&#xff1f;依据这一排名来进行选购&#xff0c;今天就给大家带来头戴式耳机…

使用TiDB企业版Lightning导入ORC文件到TiDB

作者&#xff1a; 数据源的TiDB学习之路 原文来源&#xff1a; https://tidb.net/blog/818f84f0 TiDB Lightning 是用于从静态文件导入 TB 级数据到 TiDB 集群的工具&#xff0c;常用于 TiDB 集群的初始化数据导入。在开源社区版本中&#xff0c;TiDB Lightning 支持以下文件…

python并发编程实战

python并发编程有三种 多线程Thread多进程Process多协程Coroutine cpu密集型计算 cpu密集型也叫计算密集型&#xff0c;是指I/O在很短的时间就可以完成&#xff0c;cpu需要大量的计算处理&#xff0c;特点是cpu占用率相当高 例如&#xff1a;压缩解压缩、加密解密、正则表达…

你知道吗?这四种关机重启情况,有更好解决办法

一、太长不看&#xff1a; 给4G模组VBAT断电关机&#xff0c;模组关机前未能及时退出当前基站&#xff0c;会有什么影响呢&#xff1f; 基站会误以为设备还在线&#xff0c;下次开机仍会拿着上次驻网信息去连基站。基站一看&#xff0c;上次链接还在——认为你是非法设备&…

天线工作原理:【图文讲解】

在信息传输过程中&#xff0c;我们习惯了PCB线路&#xff0c;线揽等&#xff0c;这些有线连接传输方式&#xff0c;而天线这个无线的传输方式相对不是那么好理解。但它确实在实际应用中&#xff0c;占据了很重要的位置。你有多久没有用有线电话了&#xff1f;&#xff08;20年前…

gateway--网关

在微服务架构中&#xff0c;Gateway&#xff08;网关&#xff09;是一个至关重要的组件&#xff0c;它扮演着多种关键角色&#xff0c;包括路由、负载均衡、安全控制、监控和日志记录等。 Gateway网关的作用 统一访问入口&#xff1a; Gateway作为微服务的统一入口&#xff0c…

MySQL - 运维篇

一、日志 1. 错误日志 2. 二进制日志 3. 查询日志 记录了所有的增删改查语句以及DDL语句 4. 慢查询日志 二、主从复制 1. 概述 2. 原理 3. 搭建 三、分库分表 1. 介绍 2. Mycat概述 3. Mycat入门 4. Mycat配置 5. Mycat分片 6. Mycat管理及监控 四、读写分离 1. 介绍 2. 一…

B3621 枚举元组

1.递归的具体过程&#xff0c;一个dfs1&#xff0c;产生3个dfs2&#xff0c;一个dfs2产生3个dfs3&#xff0c;一共输出9个&#xff08;用n2&#xff0c;k3举例&#xff09; 2.要记得使用return 结束当前递归 #include<bits/stdc.h> using namespace std; int n, k, a[10…

Codeforces Round 976 (Div. 2) and Divide By Zero 9.0(A~E)

A - Find Minimum Operations 思路 对 n n n进行 m m m进制分解&#xff0c;所有位上相加就是答案&#xff08;参考 m 2 m2 m2时&#xff09; 代码 // Problem: A. Find Minimum Operations // Contest: Codeforces - Codeforces Round 976 (Div. 2) and Divide By Zero 9…

大数据实时数仓Hologres(三):存储格式介绍

文章目录 存储格式介绍 一、格式 二、使用建议 三、技术原理 1、列存 2、行存 3、行列共存 四、使用示例 存储格式介绍 一、格式 在Hologres中支持行存、列存和行列共存三种存储格式&#xff0c;不同的存储格式适用于不同的场景。在建表时通过设置orientation属性指…

云计算 Cloud Computing

文章目录 1、云计算2、背景3、云计算的特点4、云计算的类型&#xff1a;按提供的服务划分5、云计算的类型&#xff1a;按部署的形式划分 1、云计算 定义&#xff1a; 云计算是一种按使用量付费的模式&#xff0c;这种模式提供可用的、便捷的、按需的网络访问&#xff0c;进入可…

Java中的五种I/O模型详解

一、阻塞I/O&#xff08;Blocking I/O&#xff09; 1.1 概念 阻塞I/O是最传统的I/O模型。在该模型中&#xff0c;当一个线程执行I/O操作时&#xff0c;如果没有数据可读或可写&#xff0c;线程将会被阻塞&#xff0c;直到I/O操作完成。 1.2 工作原理 当线程调用读取或写入数…

解决nginx+tomcat宕机完美解决方案

问题描述&#xff1a;公司项目太老了&#xff0c;还是tomcat项目&#xff0c;部署两台tomcat,做了nginx负载。最近发现每到上午10&#xff0c;下午3点&#xff0c;tomcat就宕机了&#xff0c;死活找不到原因&#xff0c;客户影响超期差&#xff0c;实在让人头疼。 解决思路&am…