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实例(五)指纹识别 1.指纹识别概述1.1概述1.2原理 2.指纹识别算法2.1特征提取2.2MCC匹配方法2.3尺度不变特征变换(SIFT) 3.显示指纹的关键点4.基于SIFT的指纹识别 作者:Xiou 1.指纹识别概述 1.1概述 指纹识别&…...
第二章 法的内容与形式
目录 第一节 法的内容与形式的概念 一、法的内容与形式的含义 二、法的内容和形式的关系 第二节 法律权利与法律义务 一、权利和义务的概念 二、权利和义务的分类 三、权利与义务的联系 第三节 法的成文形式与不成文形式 一、历史上各种法的表现形式 二、成文法与不成文…...
外包干了四年,感觉废了..
先说一下自己的情况,大专生,18年通过校招进入湖南某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…...
Git如何推送当前代码到远程仓库
第一种方法 (建立在已经配置好用户变量和ssh基础上) 在本地创建git仓库 git init 绑定远程仓库,origin是给远程仓库起的别名,也可以起其他名字,但是如果用origin,git push时可以不指出名字,如果…...
第五章 工厂模式
文章目录 一、简单工厂模式1、传统方式实现披萨订购( 可以忽略)披萨父类 Pizza子类胡椒披萨 PepperPizza子类印度披萨 GreekPizza订购披萨 OrderPizza订购披萨的 客户端 PizzaStore运行结果传统的方式的优缺点,新增子类需要修改的地方牵扯太多传统方式的究极耦合 2、…...
Spring MVC 参数解析(13)
目录 简介 调用流程 1. 首先,还是需要进行到前端控制器的doDispatch方法,这是我们的调用Spring MVC的核心入口方法 2. 在doDispatch方法内部,我们调用到了HandlerAdapter.handle(*****) 方法 3. 最终,我们会来到 RequestMappi…...
探索 Qt WebEngineWidgets:从底层原理到高级应用与技巧
探索 Qt WebEngineWidgets:从底层原理到高级应用与技巧 (Exploring Qt WebEngineWidgets: From Fundamentals to Advanced Applications and Techniques 一、Qt WebEngineWidgets 模块简介及原理 (Introduction and Principles of Qt WebEngineWidgets Module)1. Qt…...
leetcode160. 相交链表
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 注意,函数返回结果后&…...
核心业务7:放款实现
核心业务7:放款实现 1.放款实现流程 -------------------未完成生成借款人还款计划和投资人回款计划-------------- 2.数据库表 3.前端流程 4.汇付宝流程 5.尚融宝后端流程 -------------------未完成生成借款人还款计划和投资人回款计划-------------- -------------…...
STM32F4系列芯片RTC模块介绍
RTC是“实时时钟”的缩写,它是一种芯片,在计算机等电子产品中广泛应用。RTC提供了实时时钟计时功能和存储时间的能力,即时钟模块,常用于控制和记录时间的应用场合。 RTC的工作原理 RTC主要由时钟电路、电源管理电路、晶振电路、…...
MySQL 在线人数 场景分析
一般在直播或者游戏中经常会统计用户在线人数,主要分为求每个时刻的在线人数和求某个时刻的在线人数两种。 【场景】:某个时刻的在线人数、每个时刻的在线人数 【知识点】:窗口函数、时间函数、sum(tag) over (order by dt,tag desc rows b…...
使用mybatis和dynamic-datasource-spring-boot-starter动态切换数据源操作数据库
记录:415 场景:使用mybatis和dynamic-datasource-spring-boot-starter动态切换数据源操作数据库。 版本:JDK 1.8,Spring Boot 2.6.3,dynamic-datasource-spring-boot-starter-3.3.2,mybatis-3.5.9。 源码:https://github.com/b…...
【日常刷题】迷宫问题
描述 定义一个二维数组 N*M ,如 5 5 数组下所示: 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, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走…...
【Python童年游戏】满满的回忆杀—那些年玩过的童年游戏你还记得吗?那个才是你的菜?看到第一个我就泪奔了(致我们逝去的青春)
导语 滴一一学生卡🙌 结伴上车的学生仔子们 用笑声打破车厢的沉默 大人眼里的晚高峰 是给放学后快乐😀时光的加时 下车的学生匆匆起身带起 一阵熟悉的栀子香于💓 是关于校园的记忆 开始零零散散地闪现 放学后集合的秘密基地/跟着城…...
C++ | 认识标准库string和vector
本文概要 本篇文章主要介绍C的标准库类型string和vector,文中描述和代码示例很详细,看完即可掌握,感兴趣的小伙伴快来一起学习吧。 🌟🌟🌟个人简介 🌟🌟🌟 ☀️大家好&a…...
JAVA面试宝典: SpringCloud知识点(通俗易懂易背)
1、什么是 Spring Cloud? Spring Cloud 是基于 Spring Boot 的微服务架构开发工具箱,提供了在分布式系统中构建可靠的、弹性的、灵活的应用所需的大多数工具。Spring Cloud 中包含的子项目如下: Spring Cloud Config:配置管理工具…...
es学习笔记
集群环境下数据往哪个节点放? 路由计算:hash(id) %主分片的数量 集群环境下查数据怎么查? 分配控制:访问任何一个节点都能获取数据,随机访问到的这个节点称为协调节点(访问了当前节点,不一定从当前节点…...
SAS学习第9章:卡方检验之适合性检验与独立性检验
卡方检验就是统计样本的实际观测值与理论推断值之间的偏离程度,实际观测值与理论推断值之间的偏离程度就决定卡方值的大小,如果卡方值越大,二者偏差程度越大;反之,二者偏差越小;若两个值完全相等时…...
马斯克爆料Twitter裁了八成员工;OpenAI CEO:GPT-5根本不存在;小鹏被曝年终奖打0.5折 | AI一周资讯
来源: AI前线 微信号:ai-front 整理 | 凌敏 微软宣布开源 Deep Speed Chat;消息称软银旗下 Arm 启动赴美 IPO;国家网信办出台生成式 AI 管理办法;前理想 AI 芯片一号位骄旸加入三星,负责组建 GPU 团队…… 资 讯 Op…...
ASEMI代理ADG1408YRUZ-REEL7原装ADI车规级ADG1408YRUZ-REEL7
编辑:ll ASEMI代理ADG1408YRUZ-REEL7原装ADI车规级ADG1408YRUZ-REEL7 型号:ADG1408YRUZ-REEL7 品牌:ADI /亚德诺 封装:TSSOP-16 批号:2023 安装类型:表面贴装型 引脚数量:16 类型&#…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
