Opencv之sift特征检测和FLANN 匹配器进行指纹特征匹配
sift特征检测和FLANN 匹配器进行指纹匹配
目录
- sift特征检测和FLANN 匹配器进行指纹匹配
- 1 sift特征检测
- 1.1 概念
- 1.2 优缺点
- 2 FLANN 匹配器
- 2.1 概念
- 2.2 工作原理与匹配方式
- 2.3 FLANN 匹配器的使用步骤
- 2.4 优缺点
- 3 函数
- 3.1 特征检测匹配
- 3.2 匹配符合条件点并绘制
- 3 代码测试
- 3.1 单个指纹模板匹配
- 3.2 多个指纹匹配
1 sift特征检测
1.1 概念
SIFT(尺度不变特征变换)是一种用于图像处理中检测和描述图像中局部结构的算法。它是由David Lowe在1999年提出的,并在2004年进行了详细阐述。SIFT特征具有尺度不变性,这意味着即使图像的尺度发生变化,SIFT特征也能保持稳定。
1.2 优缺点
SIFT特征的优点:
- 尺度不变性:能够适应图像的尺度变化。
- 旋转不变性:能够适应图像的旋转变化。
- 对光照、仿射变换和噪声具有一定的鲁棒性。
SIFT特征的缺点:
- 计算复杂度较高,实时性较差。
- 对于非线性变换和大幅度的视角变化,SIFT特征的性能可能会下降。
2 FLANN 匹配器
2.1 概念
FLANN 匹配器(Fast Library for Approximate Nearest Neighbors,快速近似最近邻搜索库)是 OpenCV 中用于高效匹配特征描述符的工具。它通过近似算法加速最近邻搜索,特别适合处理高维数据(如 SIFT 或 SURF 描述符)。
2.2 工作原理与匹配方式
- 最近邻搜索:
- 给定一个特征描述符集合,FLANN 的目标是找到与查询描述符最接近的匹配点。
- 精确的最近邻搜索(如暴力匹配)在高维数据中计算量很大,FLANN 通过近似算法加速搜索。
- 近似算法:
- FLANN 使用了一种基于树结构的算法(如 KD-Tree 或 Hierarchical K-Means Tree)来组织数据,从而快速缩小搜索范围。
- 通过牺牲一定的精度,换取更快的搜索速度。
- 匹配方式:
- FLANN 支持两种匹配方式:
- 单匹配:为每个查询描述符找到一个最近邻。
- KNN 匹配:为每个查询描述符找到 K 个最近邻。
2.3 FLANN 匹配器的使用步骤
-
创建 FLANN 匹配器:
使用 cv2.FlannBasedMatcher 创建 FLANN 匹配器对象。 -
准备特征描述符:
使用特征检测算法(如 SIFT、SURF 或 ORB)提取图像的特征描述符。 -
进行匹配:
使用 knnMatch 方法进行 KNN 匹配,返回每个查询描述符的 K 个最近邻。 -
筛选匹配点:
根据距离比例或其他条件筛选出可靠的匹配点。
2.4 优缺点
优点:
- 高效:比暴力匹配(Brute-Force Matcher)更快,特别适合处理高维数据。
- 灵活:支持多种算法和参数配置,可以根据需求调整精度和速度。
缺点:
- 近似匹配:结果是近似的,可能存在一定的误差。
- 参数调优:需要根据具体任务调整参数,否则可能影响匹配效果。
3 函数
3.1 特征检测匹配
- 特征关键点检测
- sift = cv2.SIFT_create(),创建 SIFT 特征检测器
- kp1, des1 = sift.detectAndCompute(src, None),检测并计算 src 图像的关键点(kp1) 和描述符(des1 )
- 匹配器匹配
- flann = cv2.FlannBasedMatcher(),创建FLANN 匹配器
- matches = flann.knnMatch(des1, des2, 2) , 使用 KNN 算法进行特征(des1, des2)匹配,k=2 表示每个描述符返回两个最佳匹配
3.2 匹配符合条件点并绘制
ok = [] # 存储符合条件的匹配点
ok_n = [] # 存储对应的次佳匹配点# 遍历所有匹配点
for m, n in matches:
# 如果最佳匹配点的距离小于次佳匹配点距离的 0.65 倍,则认为是一个好的匹配if m.distance < 0.65 * n.distance:ok.append(m) # 将好的匹配点加入 ok 列表ok_n.append(n) # 将对应的次佳匹配点加入 ok_n 列表# 计算好的匹配点的数量
num = len(ok)# 如果好的匹配点数量大于等于 400,则认为验证通过
if num >= 400:result = '认证通过' # 设置验证结果为通过# 遍历所有匹配点for m, n in matches:# 再次筛选好的匹配点if m.distance < 0.65 * n.distance:ok.append(m)x1 = int(kp1[m.queryIdx].pt[0])y1 = int(kp1[m.queryIdx].pt[1])x2 = int(kp2[n.queryIdx].pt[0])y2 = int(kp2[n.queryIdx].pt[1])src = cv2.circle(src, (x1, y1), 3, (0, 0, 255), -1)model = cv2.circle(model, (x2, y2), 3, (0, 0, 255), -1)
3 代码测试
3.1 单个指纹模板匹配
图片1:

图片2:

模板:

代码展示:
import cv2
def cv_chow(name,img):cv2.imshow(name,img)cv2.waitKey(0)
def verification(src,model):sift =cv2.SIFT_create()kp1, des1 = sift.detectAndCompute(src, None)kp2, des2 = sift.detectAndCompute(model, None)flann = cv2.FlannBasedMatcher()matches = flann.knnMatch(des1, des2, 2)ok = []ok_n = []for m, n in matches:if m.distance < 0.65 * n.distance:ok.append(m)ok_n.append(n)## m,n,在kp的ptnum = len(ok)if num>=400:result = '认证通过'for m, n in matches:if m.distance < 0.65 * n.distance:ok.append(m)x1 = int(kp1[m.queryIdx].pt[0])y1 = int(kp1[m.queryIdx].pt[1])x2 = int(kp2[n.queryIdx].pt[0])y2 = int(kp2[n.queryIdx].pt[1])src = cv2.circle(src, (x1, y1), 3, (0, 0, 255), -1)model = cv2.circle(model, (x2, y2), 3, (0, 0, 255), -1)cv_chow('src', src)cv_chow('model', model)else:result = '认证失败'return resultif __name__=='__main__':src1 = cv2.imread('zhiwen1.bmp')cv_chow('src1',src1)src2 = cv2.imread('zhiwen2.bmp')cv_chow('src2', src2)model = cv2.imread('zhiwenp.bmp')cv_chow('model_', model)result1 = verification(src1,model)result2 = verification(src2, model)print(f'src1验证结果:{result1}')print(f'src2验证结果:{result2}')
运行结果:


3.2 多个指纹匹配
指纹文件库:

代码展示:
import osdef 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 = cv2.FlannBasedMatcher()matches = flann.knnMatch(des1, des2, 2)ok = []for m, n in matches:if m.distance < 0.8 * n.distance:ok.append(m)num = len(ok)return numdef getID(src,database):max = 0for file in os.listdir(database):print(file)model = os.path.join(database,file)num = getNum(src,model)print(f'文件名:{file},匹配点个数:{num}')if num>max:max = numname = fileID = name[0]if max<100:ID = 9999return IDdef getname(ID):nameID = {0:'张三',1:'李四',2:'王五',3:'赵六',4:'朱老七',5:'钱八',6:'曹九',7:'王二麻子',8:'andy',9:'Anna',9999:'没找到'}name = nameID.get(int(ID))return nameif __name__=='__main__':src = "scrpp.bmp"database = "database//database"ID = getID(src,database)name = getname(ID)print(f'识别结果:{name}')
运行结果:

相关文章:
Opencv之sift特征检测和FLANN 匹配器进行指纹特征匹配
sift特征检测和FLANN 匹配器进行指纹匹配 目录 sift特征检测和FLANN 匹配器进行指纹匹配1 sift特征检测1.1 概念1.2 优缺点 2 FLANN 匹配器2.1 概念2.2 工作原理与匹配方式2.3 FLANN 匹配器的使用步骤2.4 优缺点 3 函数3.1 特征检测匹配3.2 匹配符合条件点并绘制 3 代码测试3.1…...
rust学习~tokio的io
await Suspend execution until the result of a Future is ready. 暂停执行,直到一个 Future 的结果就绪。 .awaiting a future will suspend the current function’s execution until the executor has run the future to completion. 对一个 Future 使用 .awa…...
FPGA开发,使用Deepseek V3还是R1(2):V3和R1的区别
以下都是Deepseek生成的答案 FPGA开发,使用Deepseek V3还是R1(1):应用场景 FPGA开发,使用Deepseek V3还是R1(2):V3和R1的区别 FPGA开发,使用Deepseek V3还是R1&#x…...
本地部署大数据集群前置准备
1. 设置VMware网段 虚拟网络编辑器——更改设置——选择VMnet8——子网改成192.168.88.0——NAT设置——网关设置为192.168.88.2 2. 下载CentOS操作系统 下载CentOS 7.6(1810)版本 3. 在VMware中安装CentOS操作系统 创建新的虚拟机——典型——安装光盘映像文件——输入账…...
Spring Boot整合RabbitMQ
1. 环境准备 Spring Boot 2.1.3.RELEASERabbitMQ 3.xJDK 8 或以上Maven 3.5 2. 安装Erlang、RabbitMQ 2.1 安装前准备 RabbitMQ 依赖 Erlang 环境,需确保两者的版本匹配,官方兼容性参考:RabbitMQ & Erlang 版本对照表。 2.2 下载安…...
CDefView::_OnFSNotify函数分析
进入CDefView::_OnFSNotify函数时状态栏 _UpdateStatusBar函数之后增加一个对象,变成7个对象。 LRESULT CDefView::_OnFSNotify(LONG lNotification, LPCITEMIDLIST* ppidl) { LPITEMIDLIST pidl; LPCITEMIDLIST pidlItem; // we may be registered for no…...
精准汇报:以明确答复助力高效工作
在工作场景中,汇报工作是一项至关重要的沟通环节,它不仅关乎工作进展的有效传达,更影响着团队协作的顺畅度和整体工作效率。而汇报工作的关键,就在于给予明确肯定的答复,摒弃“应该”“可能”这类模糊词汇,…...
Java自动拆箱装箱/实例化顺序/缓存使用/原理/实例
在 Java 编程体系中,基本数据类型与包装类紧密关联,它们各自有着独特的特性和应用场景。理解两者之间的关系,特别是涉及到拆箱与装箱、实例化顺序、区域问题、缓存问题以及效率问题。 一、为什么基本类型需要包装类 泛型与集合的需求 Java…...
软件工程---基于构件的软件工程
基于构件的软件工程(CBSE)是一种软件开发方法,通过重用现有的软件构件来构建系统,从而提高开发效率和软件质量。这种方法强调软件系统的模块化设计和构建复用,使得软件开发过程更加高效和灵活。 企业软件开发…...
AMD RDNA3 GPU架构解析
本文会通过把AMD的RDNA3架构为例比喻为**“施工公司”**工作模式,深入理解GPU如何高效处理顶点着色、像素计算等任务。 一、施工公司的组织架构 1. 施工公司(WGP)与施工队(CU) WGP(Work Group Processor&…...
docker关闭mysql端口映射的使用
需求 项目中的数据库为mysql,如果将端口映射到宿主机上,容易被工具扫描出,且随着国产化的进程推进,mysql将不被允许。为了提高安全性与满足项目需求,这里采用隐藏mysql端口方式,不映射宿主机端口ÿ…...
关于对机器中的人工智能进行基准测试
大家读完觉得有帮助记得及时关注和点赞!!! 抽象 最近的基准研究声称,AI 在各种认知任务上的表现已经接近甚至超过人类的“水平”。然而,本立场文件认为,当前的 AI 评估范式不足以评估类似人类的认知能力。我…...
CSS - 妙用Sass
官方文档:https://www.sass.hk/docs/ 1.例1: each $theme in $themeList {$themeKey: map-get($theme, key);media screen and (weex-theme: $themeKey) {.btnText {max-width: 150px;include font(map-get($theme, medFont),map-get($theme, subFontS…...
MS模块创新
1. 动态分支权重融合 创新思路:引入通道注意力机制,自动学习高频/低频分支的融合权重 class DynamicMS(nn.Module):def __init__(self, in_channels1):super().__init__()# 原高频/低频分支保持不变self.high_freq ... # 与原MS模块相同self.low_freq…...
私有化部署DeepSeek并SpringBoot集成使用(附UI界面使用教程-支持语音、图片)
私有化部署DeepSeek并SpringBoot集成使用(附UI界面使用教程-支持语音、图片) windows部署ollama Ollama 是一个开源框架,专为在本地机器上便捷部署和运行大型语言模型(LLM)而设计 下载ollama 下载地址(…...
MFC中CMutex类和CSingleLock类,配合使用疑惑
在使用CMutex过程中,看到别人使用了CSingleLock类,想着明明CMutex已经可以实现线程同步了,为什么还有使用CSingleLock类呢? 在MFC中,虽然CMutex类本身可以实现线程同步,但通常会与CSingleLock类一起使用&am…...
残差收缩模块
1. 多尺度阈值生成 创新思路:融合不同尺度的统计信息(如平均池化最大池化)生成更鲁棒的阈值。 class MultiScaleShrinkage(nn.Module):def __init__(self, channel, reduction4):super().__init__()# 多尺度池化分支self.avg_pool nn.Adap…...
HOW - 在Windows浏览器中模拟MacOS的滚动条
目录 一、原生 CSS 代码实现模拟 macOS 滚动条额外优化应用到某个特定容器 二、Antd table中的滚动条场景三、使用第三方工具/扩展 如果你想让 Windows 里的滚动条 模拟 macOS 的效果(细窄、圆角、隐藏默认轨道)。 可以使用以下几种方案: 一…...
Unity 打包后EXE运行出现Field to Load il2cpp的一种情况
Unity版本2021.3.13f1c1 #if DEVELOPMENT_BUILDA1 A1 10600;#else#endif 使用 #if DEVELOPMENT_BUILD然后在下面面板使用Development Build。打包后会运行游戏EXE出现Field to Load il2cpp。 解决办法是换成IF ELSE,自己代码设置个开关、 文心一言: …...
Windows 环境下 Nginx、PHP 与 ThinkPHP 开发环境搭建
Windows 环境下 Nginx、PHP 与 ThinkPHP 开发环境搭建 目录 安装 Nginx 和 PHP配置 Nginx配置 PHP启动服务ThinkPHP 配置常见问题排查 1. 安装 Nginx 和 PHP 安装 Nginx 访问 Nginx 官网 下载 Windows 版本解压到指定目录,如 C:\nginx 安装 PHP 访问 PHP 官网…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
PH热榜 | 2025-06-08
1. Thiings 标语:一套超过1900个免费AI生成的3D图标集合 介绍:Thiings是一个不断扩展的免费AI生成3D图标库,目前已有超过1900个图标。你可以按照主题浏览,生成自己的图标,或者下载整个图标集。所有图标都可以在个人或…...
【阅读笔记】MemOS: 大语言模型内存增强生成操作系统
核心速览 研究背景 研究问题:这篇文章要解决的问题是当前大型语言模型(LLMs)在处理内存方面的局限性。LLMs虽然在语言感知和生成方面表现出色,但缺乏统一的、结构化的内存架构。现有的方法如检索增强生成(RA…...
AWS vs 阿里云:功能、服务与性能对比指南
在云计算领域,Amazon Web Services (AWS) 和阿里云 (Alibaba Cloud) 是全球领先的提供商,各自在功能范围、服务生态系统、性能表现和适用场景上具有独特优势。基于提供的引用[1]-[5],我将从功能、服务和性能三个方面进行结构化对比分析&#…...
【threejs】每天一个小案例讲解:创建基本的3D场景
代码仓 GitHub - TiffanyHoo/three_practices: Learning three.js together! 可自行clone,无需安装依赖,直接liver-server运行/直接打开chapter01中的html文件 运行效果图 知识要点 核心三要素 场景(Scene) 使用 THREE.Scene(…...
