《深度学习》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.xdnf.cn/news/1550872.html

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

相关文章

06.C/C++内存管理

在这里C的内存管理相较于C作出了许多升级&#xff0c;下面我们就来了解一下。 1.C/C内存分布 我们先来看一下下面的问题&#xff0c;温习一下C的内存分布 int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1…

Matlab进阶绘图第70期—正负面积图

正负面积图是指通过一条水平线将一条曲线分割为上下两部分&#xff0c;并分别填充不同的颜色&#xff0c;用以表示不同的类别属性。 由于Matlab中未收录的正负面积图的绘制方法&#xff0c;因此需要大家自行解决。 本文利用自己制作的PNarea工具&#xff0c;进行正负面积图的…

《程序猿之Redis缓存实战 · Redis 与数据库一致性》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

【Android 源码分析】Activity短暂的一生 -- 目录篇 (持续更新)

1. 前言 忽然有一天&#xff0c;我想要做一件事&#xff1a;去代码中去验证那些曾经被“灌输”的理论。                                                                                  …

springboot厨房达人美食分享平台(源码+文档+调试+答疑)

文章目录 前言一、主要技术&#xff1f;二、项目内容1.整体介绍&#xff08;示范&#xff09;2.运行截图3.部分代码介绍 总结更多项目 前言 厨房达人美食分享平台的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品&#xff0c…

【车载开发系列】ParaSoft单元测试环境配置(四)

【车载开发系列】ParaSoft单元测试环境配置&#xff08;四&#xff09; 【车载开发系列】ParaSoft单元测试环境配置&#xff08;四&#xff09; 【车载开发系列】ParaSoft单元测试环境配置&#xff08;四&#xff09;一. 如何设置过滤二. 如何设置静态扫描的规则三. 如何设置单…

Linux操作系统中Redis

1、什么是Redis Redis&#xff08;Remote Dictionary Server &#xff09;&#xff0c;即远程字典服务&#xff0c;是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 可以理解成一个大容量的map。…

IPS和IDS分别适用于哪些网络环境和安全需求

IPS即入侵防御系统和IDS即入侵检测系统是网络安全中的重要工具。 IPS适用于企业内部网络、数据中心以及云环境等网络环境中。 在企业内部网络中&#xff0c;特别是关键业务系统和数据中心的防护。IPS能够实时监控网络流量、识别和阻止潜在的恶意攻击&#xff0c;如DDoS攻击、SQ…

针对考研的C语言学习(定制化快速掌握重点5)

顺序表 特点&#xff1a; 写代码主要就是增删改查&#xff01;&#xff01;&#xff01; 写代码的边界性非常重要以及考研插入和删除的位置都是从1开始&#xff0c;而数组下标是从0开始 【注】下标和位置的关系 线性表最重要的是插入和删除会涉及边界问题以及判断是否合法 …

nginx的安装和使用

源码安装 1.环境准备&#xff1a;卸载其他方式安装的web应用&#xff0c;防止端口冲突 2.下载nginx源码包 wget https://nginx.org/download/nginx-1.20.2.tar.gz 3.源码编译安装 yum install -y gcc pcre-devel zlib-devel #安装依赖包 useradd -M -s /sbin/nologin ngi…

资质申请中常见的错误有哪些?

在申请建筑资质的过程中&#xff0c;企业可能会犯一些常见的错误&#xff0c;以下是一些需要避免的错误&#xff1a; 1. 资料准备不充分&#xff1a; 申请资质需要提交大量的资料&#xff0c;包括企业法人资料、财务报表、业绩证明等。资料不齐全或不准确都可能导致申请失败。…

RXE RDMA测试学习环境搭建

测试环境信息 在ubuntu20.04.6 LTS (Focal Fossa)上建立RXE学习环境。 安装工具和依赖 sudo apt install automake libtool sudo apt install libibverbs-dev libibmad-dev librdmacm-dev libibumad-dev libpci-dev sudo apt-get install libibverbs1 ibverbs-utils librdmac…

【AI论文精读1】针对知识密集型NLP任务的检索增强生成(RAG原始论文)

目录 一、简介一句话简介作者、引用数、时间论文地址开源代码地址 二、摘要三、引言四、整体架构&#xff08;用一个例子来阐明&#xff09;场景例子&#xff1a;核心点&#xff1a; 五、方法 &#xff08;架构各部分详解&#xff09;5.1 模型1. RAG-Sequence Model2. RAG-Toke…

Python:Pip包的安装与原理(Windows系统)

相关内容 Pythonhttps://blog.csdn.net/weixin_45791458/category_12403403.html?spm1001.2014.3001.5482 pip是Python的包管理工具&#xff0c;用于安装、升级和卸载Python包和依赖。它的全称是“Pip Installs Packages”&#xff0c;是Python生态系统中的标准包管理器。pip…

02Cesium中常用的鼠标事件

文章目录 02Cesium中常用的鼠标事件1、左键单击事件2、左键双击事件3、左键按下事件4、左键弹起事件5、中键按下事件6、中键弹起事件7、鼠标移动事件8、右键单击事件9、右键按下事件10、右键弹起事件11、鼠标滚轮事件具体在代码中的应用如下所示 02Cesium中常用的鼠标事件 Ces…

vue组合式api

一、ref&#xff08;基本类型数据&#xff0c;对象类型数据&#xff09; 1.作用&#xff1a;定义响应式变量 2.语法&#xff1a;let xxx ref(初始值) 3.返回值&#xff1a;一个RefImpl的实例对象&#xff0c;简称ref对象&#xff0c;ref对象的value属性是响应式的。 4.注意…

PCL 快速均匀下采样

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 快速均匀下采样 2.1.2 可视化原始点云和下采样后的点云 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#…

【有啥问啥】多目标跟踪SORT算法原理详解

多目标跟踪SORT算法原理详解 引言 多目标跟踪&#xff08;Multiple Object Tracking, MOT&#xff09;是计算机视觉领域的一个重要研究方向&#xff0c;广泛应用于视频监控、自动驾驶、人机交互等多个领域。其核心任务是在视频序列中持续、准确地识别和定位多个目标。SORT&am…

数据网格:数据去中心化的特征

在现代的数据管理架构理念中&#xff0c;常常会谈及数据网格&#xff0c;将它用来解决大规模、复杂数据环境下的数据管理和利用问题。本文将探讨数据网格的概念以及数据去中心化和数据网格的紧密联系。 一数据网格 数据网格定义&#xff1a;数据网格将数据视为一种产品&#x…

tailwindcss快速入门(上篇)

tailwindcss 相关链接 演示地址 演示地址 源码地址 源码地址 什么是 Tailwind Tailwind CSS 是一种 实用优先的 CSS 框架&#xff0c;它通过一组预定义的、基于类名的样式帮助开发者快速构建现代化、响应式的用户界面。与传统的 CSS 框架&#xff08;如 Bootstrap&#xf…