一、用法

在特征点匹配中,queryIdx和trainIdx是匹配对中的两个索引,用于指示匹配点在不同图像或特征向量中的位置。
1.假设我们有两幅图像A和B,并使用特征点提取算法(如SIFT)从它们中提取出特征点和对应的描述子。
2.在进行特征点匹配时,我们得到了一个匹配对,其中包含了两个特征点:特征点A和特征点B。
queryIdx:特征点A在图像A中的索引。
trainIdx:特征点B在图像B中的索引。
换句话说,queryIdx是指示特征点在查询图像(图像A)中的位置,而trainIdx是指示特征点在训练图像(图像B)中的位置。
举个具体的例子:
假设匹配对中的queryIdx为10,trainIdx为5。
这意味着特征点A是图像A中的第11个特征点(索引从0开始),而特征点B是图像B中的第6个特征点。
在特征点匹配中,queryIdx和trainIdx提供了特征点在不同图像中的对应关系,使我们能够在不同图像间建立联系并进行后续的操作,例如计算视角变换矩阵或进行图像配准等。

二、代码示例

import cv2
import numpy as np # 读取图像
img1 = cv2.imread('image1.jpg', 0)
img2 = cv2.imread('image2.jpg', 0) # 创建SIFT对象并检测特征点
sift = cv2.SIFT_create()
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None) # 创建BFMatcher对象
bf = cv2.BFMatcher() # 使用KNN算法进行特征点匹配
matches = bf.knnMatch(des1, des2, k=2) # 通过筛选最佳匹配对获取特征点坐标
good_matches = []
for m, n in matches:
if m.distance < 0.75 * n.distance:
good_matches.append(m) # 对匹配对按照距离进行排序
good_matches = sorted(good_matches, key=lambda x: x.distance, reverse=True) # 获取距离最远的前十个匹配对的特征点坐标
top_matches = good_matches[:10]
points1 = np.float32([kp1[m.queryIdx].pt for m in top_matches])
points2 = np.float32([kp2[m.trainIdx].pt for m in top_matches])
#.pt是KeyPoint类的一个属性,用于表示特征点的坐标。 # 打印匹配对中特征点的坐标
for i in range(len(top_matches)):
pt1 = tuple(map(int, points1[i]))
pt2 = tuple(map(int, points2[i]))
print(f"Match {i+1}: Point 1: {pt1}, Point 2: {pt2}")

输出结果:

Match 1: Point 1: (430, 79), Point 2: (170, 76)
Match 2: Point 1: (363, 56), Point 2: (100, 39)
Match 3: Point 1: (309, 225), Point 2: (29, 216)
Match 4: Point 1: (445, 3), Point 2: (181, 7)
Match 5: Point 1: (346, 77), Point 2: (80, 60)
Match 6: Point 1: (359, 94), Point 2: (100, 79)
Match 7: Point 1: (365, 80), Point 2: (106, 66)
Match 8: Point 1: (53, 53), Point 2: (298, 81)
Match 9: Point 1: (456, 363), Point 2: (168, 337)
Match 10: Point 1: (349, 110), Point 2: (84, 94)

————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/m0_70484757/article/details/131510009

其他参考链接:slam十四讲ch7中,DMatch类中的queryIdx和trainIdx

opencv中 在特征点匹配代码举例,以及queryIdx和trainIdx的用法的更多相关文章

  1. 对OpenCV中Haar特征CvHaarClassifierCascade等结构理解

    首先说一下这个级联分类器,OpenCV中级联分类器是根据VJ 04年的那篇论文(Robust Real-Time Face Detection)编写的,查看那篇论文,知道构建分类器的步骤如下: 1.根 ...

  2. OpenCV 中轮廓包裹的几个函数boundingRect、minAreaRect、minEnclosingCircle用法

    当我们得到对象轮廓后,可用boundingRect()得到包覆此轮廓的最小正矩形,minAreaRect()得到包覆轮廓的最小斜矩形,minEnclosingCircle()得到包覆此轮廓的最小圆形, ...

  3. [OpenCV实战]6 基于特征点匹配的视频稳像

    目录 1 介绍 1.1 视频稳定的方法 1.2 使用点特征匹配的视频稳定 2 算法 2.1 帧间运动信息获取 2.1.1 合适的特征点获取 2.1.2 Lucas-Kanade光流法 2.1.3 运动 ...

  4. [OpenCV-Python] OpenCV 中图像特征提取与描述 部分 V (二)

    部分 V图像特征提取与描述 OpenCV-Python 中文教程(搬运)目录 34 角点检测的 FAST 算法 目标 • 理解 FAST 算法的基础 • 使用 OpenCV 中的 FAST 算法相关函 ...

  5. 在OpenCV中实现matlab中的im2double功能

    最近在把matlab的代码转化到VS2010上. matlab中采用im2double将读入的图像转换为double型,在OpenCV中就需要对图像进行深度的转换. 读入一幅灰度图像,深度为1(8U) ...

  6. OpenCV使用FLANN进行特征点匹配

    使用FLANN进行特征点匹配 目标 在本教程中我们将涉及以下内容: 使用 FlannBasedMatcher 接口以及函数 FLANN 实现快速高效匹配( 快速最近邻逼近搜索函数库(Fast Appr ...

  7. 使用Opencv中matchTemplate模板匹配方法跟踪移动目标

    模板匹配是一种在图像中定位目标的方法,通过把输入图像在实际图像上逐像素点滑动,计算特征相似性,以此来判断当前滑块图像所在位置是目标图像的概率. 在Opencv中,模板匹配定义了6种相似性对比方式: C ...

  8. Opencv中使用Surf特征实现图像配准及对透视变换矩阵H的平移修正

    图像配准需要将一张测试图片按照第二张基准图片的尺寸.角度等形态信息进行透视(仿射)变换匹配,本例通过Surf特征的定位和匹配实现图像配准. 配准流程: 1. 提取两幅图像的Surf特征 2. 对Sur ...

  9. 第二篇 特征点匹配以及openvslam中的相关实现详解

    配置文件 在进入正题之前先做一些铺垫,在openvslam中,配置文件是必须要正确的以.yaml格式提供,通常需要指明使用的相机模型,ORB特征检测参数,跟踪参数等. #==============# ...

  10. opencv中的SIFT,SURF,ORB,FAST 特征描叙算子比较

    opencv中的SIFT,SURF,ORB,FAST 特征描叙算子比较 参考: http://wenku.baidu.com/link?url=1aDYAJBCrrK-uk2w3sSNai7h52x_ ...

随机推荐

  1. Exchange学习非常有用的网站

    Exchange学习非常有用的网站 https://docs.microsoft.com/zh-cn/exchange/plan-and-deploy/deployment-ref/network-p ...

  2. kaggle数据集某咖啡店的营销数据分析

    因为还处于数据分析的学习阶段(野生Python学者),所以在kaggle这个网站找了两个数据集来给自己练练手. 准备工作 import pandas as pd import os import ma ...

  3. Visual Studio NUGET 清理方法

    NUGET全局包存储位置配置 NuGet缓存实在是太大了,把我唯一的120G固态硬盘(系统盘)基本占用完了--只能是清理一下了,同时修改缓存路径到其他盘以便一劳永逸. 1. 在C:\Program F ...

  4. Machine Learning Week_1 Introduction 9-11

    目录 1.9 Who are Mentors? unfamiliar words 1.10 Get to Know Your Classmates unfamiliar words 1.11 Freq ...

  5. MySQL查询BLOB类型的字段

    1.MySQL有四种BLOB类型: 1.TinyBlob 最大能容纳255B的数据 2.Blob 最大能容纳65KB的 3.MediumBlob 最大能容纳16MB的数据 4.LongBlob 最大能 ...

  6. 记录:coding持续集成之自动发布项目

    把一个SpringBoot项目在DevOps一站式研发平台coding编译成jar远程部署到服务器分为几步?答:3步. 1.编译生成构建产物-jar包: 2.SCP 上传到远端服务器: 3.远程执行s ...

  7. 国密SSL证书,为政务数据安全保驾护航

    随着数字化转型的加速,政务信息化建设已成为提升政府服务效率和质量的关键.近期,国家相关部门发布了<互联网政务应用安全管理规定>,为政务应用的安全管理提供了明确的规范和要求.该规定自2024 ...

  8. element 动态合并表格---进阶版

    错误展示 正确展示 如果使用上次博客写的element 动态合并表格那么会出现上述图片情况,所以对其进行完善实现下图(正确展示)情况 处理函数 mergeTableRow(data, merge) { ...

  9. 扩展 Tomcat Web 服务器的功能

    把服务器提升到新的高度 本教程是所有 Web 服务器或应用服务器管理员的必读指南.尽管 Apache Tomcat 的实现与其他 Web 服务器略有不同,但是本教程为许多高级管理任务提供了一种符合逻辑 ...

  10. Python消息队列之Huey

    缘起: 之前在Python中使用最多的就是Celery, 同样的在这次项目中使用了Celery+eventlet的方式,但是由于具体执行的逻辑是使用的异步编写的, 当时就出现了一个问题,当使用http ...