《深度学习》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)
运行结果:

相关文章:
《深度学习》OpenCV 指纹验证、识别
目录 一、指纹验证 1、什么是指纹验证 2、步骤 1)图像采集 2)图像预处理 3)特征提取 4)特征匹配 5)相似度比较 6)结果输出 二、案例实现 1、完整代码 2、实现结果 调试模式: 三、…...
爬虫入门之爬虫原理以及请求响应
爬虫入门之爬虫原理以及请求响应 爬虫需要用到的库, 叫requests. 在导入requests库之前, 需要安装它, 打开cmd: 输入pip install 库名 pip install requests后面出现successful或requirement already就说明已经下载成功了!!! 下载出现的问题: 1.有报错或者是下载慢 修改镜像…...
CTF ciscn_2019_web_northern_china_day1_web1复现
ciscn_2019_web_northern_china_day1_web1 复现,环境源于CTFTraining 分析 拿到题目扫描,发现没有什么有用资产 扫描过程中注册账号登录,发现上传入口 上传文件,发现下载删除行为,寻找功能点,发现不能访问…...
docker命令汇总
Docker 是一个开源的应用容器引擎,它允许开发者打包应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。 以下是一些常用的 Docker 命令…...
云计算在现代企业中的应用与优势
云计算在现代企业中的应用与优势 随着信息技术的飞速发展,云计算已经成为现代企业不可或缺的一部分。作为一种创新的计算模式,云计算为企业提供了前所未有的灵活性和可扩展性,极大地推动了企业的数字化转型。 一、云计算的基本概念 云计算…...
Android平台GB28181实时回传流程和技术实现
规范解读 GB28181 中的 “INVITE” 是会话初始协议(SIP)中的一种请求方法,主要用于邀请一个或多个参与者加入特定的会话。在 GB28181 标准中,“INVITE” 请求通常用于发起媒体流的传输请求。当一个设备想要接收来自另一个设备的媒…...
Text-to-SQL方法研究
有关Text-to-SQL实现细节,可以查阅我的另一篇文章text-to-sql将自然语言转换为数据库查询语句 1、面临的挑战 自然语言问题往往包含复杂的语言结构,如嵌套语句、倒装句和省略等,很难准确映射到SQL查询上。此外,自然语言本身就存在歧义,一个问题可能有多种解读。消除…...
【Router】路由功能之MAC地址过滤(MAC Filter)功能介绍及实现
MAC地址过滤(MAC Filter) MAC 地址过滤是一种网络安全技术,通过在网络设备(如路由器)上设置规则,允许或阻止特定 MAC 地址的设备连接到网络。其主要作用是增强网络的安全性,防止未经授权的设备接入网络。 MAC Filter工作原理 MAC 地址过滤的工作原理是根据设备…...
Flink 本地 idea 调试开启 WebUI
Flink 本地 idea 调试开启 WebUI Maven 引用相关的包配置端口使用本地带UI环境启动 // maven 导入<!-- flink运行时的webUI --><dependency><groupId>org.apache.flink</groupId><artifactId>flink-runtime-web</artifactId><version…...
如何识别IP地址是独享的还是共享的
在网络环境中,IP地址的分配和使用方式直接影响到用户的在线隐私和访问安全。选择独享IP还是共享IP取决于用户的具体需求,理解这两种IP地址的差异及其特点至关重要。本文将探讨如何区分独享IP和共享IP,以及各自的优缺点。 1. 什么是独享IP与共…...
X-Spreadsheet使用教程:打造你的Web端电子表格应用
在Web开发中,经常需要处理数据表格的展示与编辑,而X-Spreadsheet作为一款轻量级、功能强大的JavaScript电子表格库,为开发者提供了一个便捷的解决方案。本文将详细介绍如何使用X-Spreadsheet在Web项目中创建和配置电子表格,让你的…...
订餐点餐|订餐系统基于java的订餐点餐系统小程序设计与实现(源码+数据库+文档)
订餐点餐系统小程序 目录 基于java的订餐点餐系统小程序设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设布…...
Tkinter制作登录界面以及登陆后页面切换(一)
Tkinter制作登录界面以及登陆后页面切换(一) 前言序言1. 由来2. 思路3. 项目结构描述4. 项目实战1. 登录界面实现(代码)2. 首页界面实现(代码)3. 打包build.py(与main.py同级目录)4.…...
Colorful/七彩虹将星X17 AT 23 英特尔13代处理器 Win11原厂OEM系统 带COLORFUL一键还原
安装完毕自带原厂驱动和预装软件以及一键恢复功能,自动重建COLORFUL RECOVERY功能,恢复到新机开箱状态。 【格式】:iso 【系统类型】:Windows11 原厂系统下载网址:http://www.bioxt.cn 注意:安装系统会…...
《Ubuntu20.04环境下的ROS进阶学习8》
一、中断和定时器中断 在ROS中我们经常会遇到要使用中断函数的情况,中断函数的触发方式有很多种,比如检测到某个引脚的电平变化,或某个数据达到了一定的范围,但最实用的中断触发方式还是定时器中断。 二、编写ROS的中断代码 ros中…...
ubuntu24.04 怎么调整swap分区的大小,调整为16G
在Ubuntu中,swap分区的大小通常建议为物理内存的1到2倍,具体取决于你的使用需求和系统内存。例如,如果你有8GB内存,swap可以设置为8GB到16GB。swap的主要作用是当物理内存不足时,提供额外的虚拟内存,帮助防…...
【论文阅读】视觉里程计攻击
Adversary is on the Road: Attacks on Visual SLAM using Unnoticeable Adversarial Patch 一、视觉SLAM的不安全因素 根据论文的分析,视觉SLAM由于完全依赖于特征,缺少验证机制导致算法不安全。前端在受到干扰的情况下,会导致误匹配增加&…...
解决 Git LFS 切换分支失败问题
场景描述 在本地已有分支 A 的情况下,目前工作在分支 B。当尝试从 B 分支切回 A 分支时,由于 A 分支存在 LFS 上传的大文件,导致切换失败。这个问题通常是因为某些 LFS 文件在服务器上不存在或没有权限访问。 报错日志 切换分支时遇到的错…...
BaoStock 的安装
安装 pip3 install baostock使用这个库登录免费帐户时有时候会出现登录失败的问题 import baostock as bs # 登录系统 lg bs.login() # 登出系统 bs.logout()login failed! logout failed!可能是由于高版本的python需要验证ssl,本地将其设置为可信服务器地址可以…...
聚势启新 智向未来 | 重庆华阳通用科技有限公司揭牌成立
助推两江新区汽车产业高质量发展 (以下文字内容转载自两江新区网) 9月26日,重庆华阳通用科技有限公司(华阳通用重庆子公司)在两江新区揭牌成立,将致力于智能座舱、智能驾驶两大领域,不断加大技术研发投入…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...
全面解析数据库:从基础概念到前沿应用
在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...
