当前位置: 首页 > news >正文

OpenCV实例(五)指纹识别

OpenCV实例(五)指纹识别

  • 1.指纹识别概述
    • 1.1概述
    • 1.2原理
  • 2.指纹识别算法
    • 2.1特征提取
    • 2.2MCC匹配方法
    • 2.3尺度不变特征变换(SIFT)
  • 3.显示指纹的关键点
  • 4.基于SIFT的指纹识别

作者:Xiou

1.指纹识别概述

1.1概述

指纹识别,简单来说就是判断一枚未知的指纹属于一组已知指纹里面的哪个人的指纹。这个识别过程与我们在村口识别远处走来的人类似,首先,要抓住主要特征,二者的主要特征要一致;其次,二者要有足够多的主要特征一致。满足了这两个条件就能判断一枚指纹是否与某个人的指纹一致了。

图像处理过程中非常关键的一个步骤就是特征提取。特征提取需要解决的问题有如下两个:
● 选择有用的特征。该过程要选择核心的关键特征,该特征要能体现当前图像的个性。

● 将特征量化。特征是抽象的,是计算机无法理解的,要把特征转换成数值的形式,以便通过计算完成图像的识别、匹配等。

图像的个性化特征,是指能够体现图像自身特点的、易于区别于其他图像的特征。个性化特征既可以是本类图像的专有特征,也可以是图像的通用特征。例如,在进行指纹识别时,可以采用两种不同的方式提取个性化特征:

● 提取指纹的专有特征,如脊线的方向、分叉点、顶点等。这些特征是针对指纹图像设计的。

● 提取图像中的关键点特征。关键点特征并不是每类图像专有的特征。例如,一些角点、拐点等形态或方向特征,提取指纹图像中这些关键点特征的方式与提取其他类型图像的关键点特征的方式没有区别。在处理其他类型的图像时,可以采用提取指纹图像关键点特征的方式将这些关键点特征提取出来,并在识别、比较等场景中使用。

1.2原理

在指纹识别过程中,非常关键的一个步骤是对指纹特征的处理。

通常情况下,要先提取已知指纹的特征,并将其存储在模板库中,以便在后续进行指纹识别时与待识别指纹特征进行比对。录入指纹特征的过程如图所示。

在这里插入图片描述
识别指纹时,可能存在如下两种情况。

● 一对一验证。此时,主要验证当前指纹是否和已知指纹一致,如利用指纹解锁手机。
● 一对多识别。此时,主要识别当前指纹和指纹库众多指纹中的哪个指纹基本一致,如单位的打卡系统。

2.指纹识别算法

基于指纹特征的指纹识别方法是一种非常传统的方法。该方法主要关注指纹自身的个性化特征,希望通过计算指纹个性化特征差异实现指纹识别。本节将主要介绍指纹的个性化特征表示、提取及基于指纹特征的指纹识别方法。

2.1特征提取

在这里插入图片描述
1.关键点类型的确定通常情况下,使用相交数(Crossing Number)判断关键点的类型。

2.关键点角度的确定针对不同类型的关键点采用不同的方式确定其角度。

标准化文件ISO/IEC 19794-2对指纹的关键点(Finger Minutiae Data)进行了细致的约定,可以参考该文件获取更多细节信息。

2.2MCC匹配方法

获得上述细节信息后,可以对指纹关键点特征进行进一步编码,以进行比较判断,从而实现指纹的验证、识别功能。

2010年,意大利博洛尼亚大学的Raffaele Cappelli等人提出了MCC(Minutia Cylinder-Code,细节点柱形编码),该编码旨在更有效地完成指纹识别过程中的关键点特征表示和匹配。

MCC是一种基于3D数据结构(称为圆柱体)的表示方式,该圆柱体由关键点的位置和方向构建。也可以说,MCC存储了关键点的距离、方向信息,并对此进行了重构,保证了关键点具有旋转、平移不变性。

MCC是非常有影响力非常好用的特征。在实践中,可以直接用该算法提取指纹特征,也可以根据需要提取更有特色的特征。从该特征的提取过程可以看到,在获取特征值时要尽可能让特征值具有如下特点。

● 包含更多信息:不仅要包含当前关键点的特征,还要尽可能包含周围更多关键点的特征。这样的特征信息量大,更能体现图像自身特点。或者说,这样的特征包含了图像内许多关键点的特征。

● 具有健壮性:特征在旋转、缩放、模糊等操作前后能够保持一致性,如SIFT特征。

2.3尺度不变特征变换(SIFT)

SIFT(Scale Invariant Feature Transform,SIFT)特征是一种与图像的大小和旋转无关的关键点特征,该特征不仅仅适用于指纹图像,还适用于其他图像。

SIFT特征的关键特性是与图像的大小和旋转无关,同时对于光线、噪声等不敏感(具有较好的健壮性)。

SIFT算法描述的特征能够很方便地被提取出来,同时具有极强的独特性(显著性),即使在海量的数据中也很容易被辨识,不易发生误认。同时SIFT算法可以通过对局部特征的辨识完成整体图像的确认,该特点对于辨识局部被遮蔽的物体非常有效。上述优点使得SIFT算法适用于在简单的硬件设备下实现指纹识别。

SIFT主要包含如下三个步骤。
Step 1:尺度空间变换。该步骤使图像在尺寸大小、清晰度上发生变换,旨在找到变换前后稳定存在的特征。Step 2:关键点定位。该步骤旨在找到局域范围内的极大值、极小值,并将这些极值点作为关键点。
Step 3:通过方向描述关键点。该步骤首先找到图像的方向,然后通过该方向确定每一个关键点邻域内像素点的方向,并将该方向集合作为当前关键点的特征值。

3.显示指纹的关键点

(1)Step 1:实例化SIFT特征。OpenCV中的函数SIFT_create可实现实例化。SIFT的相关功能在OpenCV的贡献包内,使用SIFT需要通过pip在Anaconda Prompt(或Windows命令行提示符窗口)内安装贡献包,具体为
在这里插入图片描述
SIFT的专利权于2020年3月6日到期,因此在之前的一段时间内,OpenCV不包含SIFT的相关功能。(2)Step 2:找出图像中的关键点,并计算关键点对应的SIFT特征向量。OpenCV中的函数detectAndCompute可完成检测和计算关键点的功能,其语法格式为:

在这里插入图片描述
通常情况下,对掩模没有要求。

其中,返回值“关键点描述符”为128维向量组成的列表;“关键点”为关键点列表,每个元素为一个关键点(KeyPoint),其包含信息如下:

● pt:关键点的坐标。
● size:描述关键点的区域。
● angle:角度,表示关键点的方向。
● response:响应程度,代表该关键点特征的独特性,越高越好。
● octave:表示从金字塔哪一层提取的数据。
● class_id:当要对图像进行分类时,可以通过该参数对每个关键点进行区分,未设定时为-1。
(3)Step 3:打印、可视化关键点。打印关键点时直接使用print语句即可。可视化关键点时,在OpenCV中使用函数drawKeypoints实现关键点绘制,其语法格式为:
在这里插入图片描述
代码实例:

# -*- coding: utf-8 -*-
import numpy as np
import cv2
#==========读取、显示指纹图像============
fp= cv2.imread("fingerprint.png")
cv2.imshow("fingerprint",fp)
#==========SIFT==================
sift = cv2.SIFT_create()  #SIFT专利已经到期,可以正常使用。要安装贡献包:opencv-contrib-python
kp, des = sift.detectAndCompute(fp, None)
#==========绘制关键点==================
cv2.drawKeypoints(fp,kp,fp)
#==========显示关键点信息、描述符==================
print("关键点个数:",len(kp))              #显示kp的长度
print("前五个关键点:",kp[:5])             #显示前5条数据
print("第一个关键点的坐标:",kp[0].pt)
print("第一个关键点的区域:",kp[0].size)
print("第一个关键点的角度:",kp[0].angle)
print("第一个关键点的响应:",kp[0].response)
print("第一个关键点的层数:",kp[0].octave)
print("第一个关键点的类id:",kp[0].class_id)
print("描述符形状:",np.shape(des))         #显示des的形状
print("第一个描述符:",des[0])              #显示des[0]的值
#==========可视化关键点==================
cv2.imshow("points",fp)
cv2.waitKey()
cv2.destroyAllWindows()

输出结果:
在这里插入图片描述

在这里插入图片描述

4.基于SIFT的指纹识别

代码实例:

# -*- coding: utf-8 -*-import os
import cv2
#===============计算两个指纹间匹配点的个数====================
def getNum(src, model):img1 = cv2.imread(src)  img2 = cv2.imread(model) sift = cv2.SIFT_create()kp1, des1 = sift.detectAndCompute(img1, None)kp2, des2 = sift.detectAndCompute(img2, None)FLANN_INDEX_KDTREE = 0index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)search_params = dict(checks=50)flann = cv2.FlannBasedMatcher(index_params, search_params)matches = flann.knnMatch(des1, des2, k=2)ok = []for m, n in matches: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):model = os.path.join(database, file)num = getNum(src, model)print("文件名:",file,"距离:",num)if  max < num:max = numname = fileID=name[:1]if  max < 100:   ID= 9999return ID#==========根据指纹编号,获取对应姓名==============
def getName(ID):nameID={0:'孙悟空',1:'猪八戒',2:'红孩儿',3:'刘能',4:'赵四',5:'杰克',6:'杰克森',7:'tonny',8:'大柱子',9:'翠花',9999:"没找到"}name=nameID.get(int(ID))return name#==============主函数====================
if __name__ == "__main__":src=r"identification/src.bmp"database=r"identification/database"ID=getID(src,database)name=getName(ID)print("识别结果为:",name)

输出结果:

在这里插入图片描述
在这里插入图片描述

相关文章:

OpenCV实例(五)指纹识别

OpenCV实例&#xff08;五&#xff09;指纹识别 1.指纹识别概述1.1概述1.2原理 2.指纹识别算法2.1特征提取2.2MCC匹配方法2.3尺度不变特征变换&#xff08;SIFT&#xff09; 3.显示指纹的关键点4.基于SIFT的指纹识别 作者&#xff1a;Xiou 1.指纹识别概述 1.1概述 指纹识别&…...

第二章 法的内容与形式

目录 第一节 法的内容与形式的概念 一、法的内容与形式的含义 二、法的内容和形式的关系 第二节 法律权利与法律义务 一、权利和义务的概念 二、权利和义务的分类 三、权利与义务的联系 第三节 法的成文形式与不成文形式 一、历史上各种法的表现形式 二、成文法与不成文…...

外包干了四年,感觉废了..

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…...

Git如何推送当前代码到远程仓库

第一种方法 &#xff08;建立在已经配置好用户变量和ssh基础上&#xff09; 在本地创建git仓库 git init 绑定远程仓库&#xff0c;origin是给远程仓库起的别名&#xff0c;也可以起其他名字&#xff0c;但是如果用origin&#xff0c;git push时可以不指出名字&#xff0c;如果…...

第五章 工厂模式

文章目录 一、简单工厂模式1、传统方式实现披萨订购( 可以忽略)披萨父类 Pizza子类胡椒披萨 PepperPizza子类印度披萨 GreekPizza订购披萨 OrderPizza订购披萨的 客户端 PizzaStore运行结果传统的方式的优缺点&#xff0c;新增子类需要修改的地方牵扯太多传统方式的究极耦合 2、…...

Spring MVC 参数解析(13)

目录 简介 调用流程 1. 首先&#xff0c;还是需要进行到前端控制器的doDispatch方法&#xff0c;这是我们的调用Spring MVC的核心入口方法 2. 在doDispatch方法内部&#xff0c;我们调用到了HandlerAdapter.handle(*****) 方法 3. 最终&#xff0c;我们会来到 RequestMappi…...

探索 Qt WebEngineWidgets:从底层原理到高级应用与技巧

探索 Qt WebEngineWidgets&#xff1a;从底层原理到高级应用与技巧 (Exploring Qt WebEngineWidgets: From Fundamentals to Advanced Applications and Techniques 一、Qt WebEngineWidgets 模块简介及原理 (Introduction and Principles of Qt WebEngineWidgets Module)1. Qt…...

leetcode160. 相交链表

给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结果后&…...

核心业务7:放款实现

核心业务7:放款实现 1.放款实现流程 -------------------未完成生成借款人还款计划和投资人回款计划-------------- 2.数据库表 3.前端流程 4.汇付宝流程 5.尚融宝后端流程 -------------------未完成生成借款人还款计划和投资人回款计划-------------- -------------…...

STM32F4系列芯片RTC模块介绍

RTC是“实时时钟”的缩写&#xff0c;它是一种芯片&#xff0c;在计算机等电子产品中广泛应用。RTC提供了实时时钟计时功能和存储时间的能力&#xff0c;即时钟模块&#xff0c;常用于控制和记录时间的应用场合。 RTC的工作原理 RTC主要由时钟电路、电源管理电路、晶振电路、…...

MySQL 在线人数 场景分析

一般在直播或者游戏中经常会统计用户在线人数&#xff0c;主要分为求每个时刻的在线人数和求某个时刻的在线人数两种。 【场景】&#xff1a;某个时刻的在线人数、每个时刻的在线人数 【知识点】&#xff1a;窗口函数、时间函数、sum(tag) over (order by dt,tag desc rows b…...

使用mybatis和dynamic-datasource-spring-boot-starter动态切换数据源操作数据库

记录&#xff1a;415 场景&#xff1a;使用mybatis和dynamic-datasource-spring-boot-starter动态切换数据源操作数据库。 版本&#xff1a;JDK 1.8,Spring Boot 2.6.3,dynamic-datasource-spring-boot-starter-3.3.2,mybatis-3.5.9。 源码&#xff1a;https://github.com/b…...

【日常刷题】迷宫问题

描述 定义一个二维数组 N*M &#xff0c;如 5 5 数组下所示&#xff1a; int maze[5][5] { 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫&#xff0c;其中的1表示墙壁&#xff0c;0表示可以走的路&#xff0c;只能横着走…...

【Python童年游戏】满满的回忆杀—那些年玩过的童年游戏你还记得吗?那个才是你的菜?看到第一个我就泪奔了(致我们逝去的青春)

导语 滴一一学生卡&#x1f64c; 结伴上车的学生仔子们 用笑声打破车厢的沉默 大人眼里的晚高峰 是给放学后快乐&#x1f600;时光的加时 下车的学生匆匆起身带起 一阵熟悉的栀子香于&#x1f493; 是关于校园的记忆 开始零零散散地闪现 放学后集合的秘密基地/跟着城…...

C++ | 认识标准库string和vector

本文概要 本篇文章主要介绍C的标准库类型string和vector&#xff0c;文中描述和代码示例很详细&#xff0c;看完即可掌握&#xff0c;感兴趣的小伙伴快来一起学习吧。 &#x1f31f;&#x1f31f;&#x1f31f;个人简介 &#x1f31f;&#x1f31f;&#x1f31f; ☀️大家好&a…...

JAVA面试宝典: SpringCloud知识点(通俗易懂易背)

1、什么是 Spring Cloud&#xff1f; Spring Cloud 是基于 Spring Boot 的微服务架构开发工具箱&#xff0c;提供了在分布式系统中构建可靠的、弹性的、灵活的应用所需的大多数工具。Spring Cloud 中包含的子项目如下&#xff1a; Spring Cloud Config&#xff1a;配置管理工具…...

es学习笔记

集群环境下数据往哪个节点放? 路由计算&#xff1a;hash(id) %主分片的数量 集群环境下查数据怎么查&#xff1f; 分配控制&#xff1a;访问任何一个节点都能获取数据&#xff0c;随机访问到的这个节点称为协调节点&#xff08;访问了当前节点&#xff0c;不一定从当前节点…...

SAS学习第9章:卡方检验之适合性检验与独立性检验

卡方检验就是统计样本的实际观测值与理论推断值之间的偏离程度&#xff0c;实际观测值与理论推断值之间的偏离程度就决定卡方值的大小&#xff0c;如果卡方值越大&#xff0c;二者偏差程度越大&#xff1b;反之&#xff0c;二者偏差越小&#xff1b;若两个值完全相等时&#xf…...

马斯克爆料Twitter裁了八成员工;OpenAI CEO:GPT-5根本不存在;小鹏被曝年终奖打0.5折 | AI一周资讯

来源: AI前线 微信号&#xff1a;ai-front 整理 | 凌敏 微软宣布开源 Deep Speed Chat&#xff1b;消息称软银旗下 Arm 启动赴美 IPO&#xff1b;国家网信办出台生成式 AI 管理办法&#xff1b;前理想 AI 芯片一号位骄旸加入三星&#xff0c;负责组建 GPU 团队…… 资 讯 Op…...

ASEMI代理ADG1408YRUZ-REEL7原装ADI车规级ADG1408YRUZ-REEL7

编辑&#xff1a;ll ASEMI代理ADG1408YRUZ-REEL7原装ADI车规级ADG1408YRUZ-REEL7 型号&#xff1a;ADG1408YRUZ-REEL7 品牌&#xff1a;ADI /亚德诺 封装&#xff1a;TSSOP-16 批号&#xff1a;2023 安装类型&#xff1a;表面贴装型 引脚数量&#xff1a;16 类型&#…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...