这个利用了前面学到的SIFT特征检测来实现的,然后这里主要就是引入了一个新的匹配器。这里

匹配是用KNN算法进行匹配的。下面来看下细节。

介绍函数

由于要频繁展示,所以这里定义了一个函数。

def cv_show(name, img):cv2.imshow(name, img)cv2.waitKey(0)

导入图片

if __name__ == "__main__":# 读取图像src1 = cv2.imread("zhiwen3.bmp")src2 = cv2.imread("zhiwen2.bmp")model = cv2.imread("zhiwen1.bmp")# 检查图像是否成功加载if src1 is None or src2 is None or model is None:print("错误: 无法加载图像文件")else:# 显示图像(需要指定窗口名称)cv_show('src1', src1)cv_show('src2', src2)cv_show('model', model)# 进行认证验证result1 = verification(src1, model)result2 = verification(src2, model)print("src1验证结果为:", result1)print("src2验证结果为:", result2)

可以看到这里导入了三张图片,一张目标图片,两张图片。然后打印出结果

匹配函数

def verification(src, model):
# 创建SIFT特征提取器
sift = cv2.SIFT_create()

这里创建了一个SIFT特征提取器,前面一篇文章讲过的。

    # 检测关键点和计算描述符
kp1, des1 = sift.detectAndCompute(src, None)  # 源图像      第二个参数 掩膜
kp2, des2 = sift.detectAndCompute(model, None)  # 模板图像

然后这里返回了重要信息kp和des

kp

  • 位置信息​ (pt):关键点在图像中的坐标位置 (x, y)(重要,后面要用来标注出匹配点)
  • 尺度信息​ (size):关键点被检测到的尺度级别
  • 方向信息​ (angle):关键点的主方向,用于实现旋转不变性
  • 响应强度​ (response):表示该特征点的显著程度

des

描述符的特点​:

  • 通常是高维向量(如SIFT描述符是128维)
  • 描述了关键点周围区域的视觉外观
  • 对光照变化、旋转、尺度变化具有一定的不变性
  • 相似的图像区域会产生相似的描述符向量

    # 检查是否有足够的特征点
if des1 is None or des2 is None or len(des1) < 2 or len(des2) < 2:
return "认证失败(特征点不足)"

检测看数量够不够匹配了,有时候特征太少,匹配不成功出现异常。
# 创建FLANN匹配器
flann = cv2.FlannBasedMatcher()
# 使用K近邻匹配
matches = flann.knnMatch(des1, des2, k=2)

建立了一个FLANN匹配器,用于直接传入两个的描述符的特点,然后就可以匹配了

    # 应用Lowe's比率测试筛选优质匹配
good_matches = []
for m, n in matches:
if m.distance < 0.7 * n.distance:  # 通常使用0.7-0.8的比率
good_matches.append(m)

这里我们前面参数k=2,是检测我们这个点对应匹配两个点,然后去计算这两个点距离我们点的欧氏距离,然后得出如果两个距离很接近就说明我们点匹配失败。

    # 统计优质匹配数量
num = len(good_matches)

得到匹配点的个数,这里也可以看作匹配度

    # 可视化匹配结果(可选)
img_match = cv2.drawMatches(src, kp1, model, kp2, good_matches, None,
flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
cv_show('匹配结果', img_match)

这里是可视化结果的一个方法。

    # 根据匹配数量判断认证结果
if num >= 500:  # 阈值可根据实际情况调整
result = "认证通过"
else:
result = "认证失败"

    return f"{result} (匹配点: {num})"

总体代码

import cv2
import numpy as np  # 需要添加此导入def cv_show(name, img):cv2.imshow(name, img)cv2.waitKey(0)def verification(src, model):# 创建SIFT特征提取器sift = cv2.SIFT_create()# 检测关键点和计算描述符kp1, des1 = sift.detectAndCompute(src, None)  # 源图像      第二个参数 掩膜kp2, des2 = sift.detectAndCompute(model, None)  # 模板图像# 检查是否有足够的特征点if des1 is None or des2 is None or len(des1) < 2 or len(des2) < 2:return "认证失败(特征点不足)"# 创建FLANN匹配器flann = cv2.FlannBasedMatcher()# 使用K近邻匹配matches = flann.knnMatch(des1, des2, k=2)# 应用Lowe's比率测试筛选优质匹配good_matches = []for m, n in matches:if m.distance < 0.7 * n.distance:  # 通常使用0.7-0.8的比率good_matches.append(m)# 统计优质匹配数量num = len(good_matches)# 可视化匹配结果(可选)img_match = cv2.drawMatches(src, kp1, model, kp2, good_matches, None,flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)cv_show('匹配结果', img_match)# 根据匹配数量判断认证结果if num >= 500:  # 阈值可根据实际情况调整result = "认证通过"else:result = "认证失败"return f"{result} (匹配点: {num})"if __name__ == "__main__":# 读取图像src1 = cv2.imread("zhiwen3.bmp")src2 = cv2.imread("zhiwen2.bmp")model = cv2.imread("zhiwen1.bmp")# 检查图像是否成功加载if src1 is None or src2 is None or model is None:print("错误: 无法加载图像文件")else:# 显示图像(需要指定窗口名称)cv_show('src1', src1)cv_show('src2', src2)cv_show('model', model)# 进行认证验证result1 = verification(src1, model)result2 = verification(src2, model)print("src1验证结果为:", result1)print("src2验证结果为:", result2)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/97861.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/97861.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/97861.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络安全渗透测试第一步信息收集

信息收集是渗透测试中最基础且关键的一步&#xff0c;它直接影响后续漏洞发现和利用的成功率。本文将系统介绍信息收集的常用方法、工具和技巧&#xff0c;帮助你在实战中高效定位目标弱点。 一、搜索引擎利用 1. Google Hacking 通过Google搜索语法快速定位敏感信息、后台地…

C++——类和对象1

1.类的定义1.1 类定义格式class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{ }中的内容是类的主题为了&#xff0c;注意类定义结束时后面的分号不能省略。类体中的内容称为类的成员&#xff1a;类中的变量称为类的属性或成员变量&#xff1b;类中的函数称为类的方…

动手学Agent:Agent设计模式——构建有效Agent的7种模型

Agent本身的定义也不是绝对的&#xff0c;从LLM到最高等级的Agent&#xff0c;中间是有大量灰度地带的&#xff0c;在Anthropic看来&#xff0c;Agent可以以多种方式定义&#xff0c;有些人将完全自主系统定义为Agent&#xff0c;而另一些团队则将预定义的工作流程定义为Agent。…

Windows 下 .venv 激活脚本深度定制:同时注入 PyTorch 调试日志与国内网络加速通道——从“能跑”到“好调”的完整工程化方案

Windows 下 .venv 激活脚本深度定制&#xff1a;同时注入 PyTorch 调试日志与国内网络加速通道 ——从“能跑”到“好调”的完整工程化方案 一、为什么非得改激活脚本&#xff1f; 重复劳动最耗时 每次打开终端都要敲四五行 set/export&#xff0c;人脑就是不可靠的剪贴板。 环…

[BX]和loop指令,debug和masm汇编编译器对指令的不同处理,循环,大小寄存器的包含关系,操作数据长度与寄存器的关系,段前缀

[bx]是什么[bx]这个表达方式和[0]很像&#xff0c;他们俩的功能也很像。之前就提到了&#xff0c;[0]表示一个内存单元&#xff0c;他的偏移地址是0。从这边我们可以引出内存单元的定义&#xff1a;要有内存单元的地址&#xff0c;要有内存单元的长度&#xff08;类型&#xff…

域格YM310 X09移芯CAT1模组HTTPS连接服务器

HTTPS连接服务器 本文档介绍了HTTPS连接服务器的大致流程&#xff0c;测试服务器为httpbin.org。 HTTPS连接服务器流程 创建证书文件 创建一个文件 ATFSCREATE<filename>参数&#xff1a;<filename> 文件名 写入CA证书 ATFSWRITE<filename>,<mode&…

【ManiSkill】常见envs学习笔记

1. StackCube-v1 用于模拟机器人在桌面场景中将红色立方体&#xff08;cubeA&#xff09;堆叠到绿色立方体&#xff08;cubeB&#xff09;上的操作。该任务强调精确抓取、放置和稳定性控制。成功条件包括红色立方体稳定堆叠在绿色立方体上且不被机器人抓取。 参数 (Arguments…

Java 网络编程全解析

前言&#xff1a;网络编程的意义与价值 前言&#xff1a;网络编程的意义与价值 在当今互联网时代&#xff0c;网络编程是软件开发的核心技能之一。无论是桌面应用、移动应用还是企业级系统&#xff0c;几乎都需要与网络交互。Java 作为一门跨平台的编程语言&#xff0c;提供了完…

HarmonyOS应用拉起系列(三):如何直接拉起腾讯/百度/高德地图进行导航

在鸿蒙应用开发中&#xff0c;经常需要跳转第三方地图应用&#xff08;如 腾讯地图、百度地图、高德地图&#xff09;进行导航。无论是出行类 App、物流类 App&#xff0c;还是线下活动类应用&#xff0c;都存在“跳转地图导航”的实际需求。写完HarmonyOS应用拉起系列一和二后…

PCGrad解决多任务冲突

论文解读&#xff1a;"Gradient Surgery for Multi-Task Learning" 1. 论文标题直译 Gradient Surgery: 梯度手术for Multi-Task Learning: 应用于多任务学习 合在一起就是&#xff1a;为多任务学习量身定制的梯度手术。这个名字非常形象地概括了它的核心思想。 …

Nvidia显卡架构解析与cuda应用生态浅析

文章目录 0. Nvidia显卡简介 一、主要显卡系列 二、主要GPU架构与代表产品 1.main 1.1 CUDA 13.0 的重大变化 1.2 V100 的硬件短板已显现 1.3 这意味着什么? 1.4 写在后面 彩蛋:V100 0. Nvidia显卡简介 一、主要显卡系列 GeForce 系列(消费级) 用途:游戏、创作、日常图形…

开发指南:使用 MQTTNet 库构建 .Net 物联网 MQTT 应用程序

一、背景介绍 随着物联网的兴起&#xff0c;.Net 框架在构建物联网应用程序方面变得越来越流行。微软的 .Net Core 和 .Net 框架为开发人员提供了一组工具和库&#xff0c;以构建可以在 Raspberry Pi、HummingBoard、BeagleBoard、Pine A64 等平台上运行的物联网应用程序。 MQT…

突破性能瓶颈:基于腾讯云EdgeOne的AI图片生成器全球加速实践

1. 项目背景与挑战 1.1 开发背景 随着AIGC技术爆发&#xff0c;我们团队决定开发一款多模型支持的AI图片生成器&#xff0c;主要解决以下痛点&#xff1a; 不同AI模型的参数规范不统一生成结果难以系统化管理缺乏企业级的安全水印方案全球用户访问延迟高&#xff0c;中国用户…

一、Java 基础入门:从 0 到 1 认识 Java(详细笔记)

1.1 Java 语言简介与发展历程 Java 是一门面向对象的高级编程语言&#xff0c;以“跨平台、安全、稳定”为核心特性&#xff0c;自诞生以来长期占据编程语言排行榜前列&#xff0c;广泛应用于后端开发、移动端开发、大数据等领域。 1.1.1 起源与核心人物 起源背景&#xff1…

uniapp:根据目的地经纬度,名称,唤起高德/百度地图来导航,兼容App,H5,小程序

1、需要自行申请高德地图的key,配置manifest.json 2、MapSelector选择组件封装 <template><view><u-action-sheet :list="mapList" v-model="show" @click="changeMap"></u-action-sheet></view> </template&…

我对 WPF 动摇时的选择:.NET Framework 4.6.2+WPF+Islands+UWP+CompostionApi

目录 NET Framework 4.6.2的最大亮点 为什么固守462不升级 WPF-开发体验的巅峰 为什么对WPF动摇了 基于IslandsUWP的滤镜尝试 总结 NET Framework 4.6.2的最大亮点 安全性能大提升&#xff1a; 默认启用TLS1.2协议&#xff0c;更安全&#xff0c;它为后续的版本提供了重…

SpringBoot大文件下载失败解决方案

SpringBoot大文件下载失败解决方案 后端以文件流方式给前端接收下载文件,文件过大时出现下载失败的情况或者打开后提示文件损坏,实际是字节未完全读取写入。 针对大文件下载失败的情况,以下是详细的解决方案: 大文件下载失败的主要原因 内存溢出:一次性加载大文件到内存…

torch.gather

torch.gather 介绍 torch.gather(input, dim, index, *, sparse_gradFalse, outNone) → Tensor 沿由 dim 指定的轴收集值。 对于三维张量&#xff0c;输出按如下方式确定&#xff1a; out[i][j][k] input[index[i][j][k]][j][k] # 如果 dim 0 out[i][j][k] input[i][i…

Golang | http/server Gin框架简述

http/server http指的是Golang中的net/http包&#xff0c;这里用的是1.23.10。 概览 http包的作用文档里写的很简明&#xff1a;Package http provides HTTP client and server implementations. 主要是提供http的客户端和服务端&#xff0c;也就是能作为客户端发http请求&a…

Vision Transformer (ViT) :Transformer在computer vision领域的应用(三)

Experiment 上来的一段话就概括了整章的内容。 We evaluate the representation learning capabilities of ResNet, Vision Transformer (ViT), and the hybrid. 章节的一开头就说明了,对比的模型就是 ResNet,CNN领域中的代码模型。 ViT。 上一篇中提到的Hybrid模型,也就是…