首页 > 其他分享 >opencv中 在特征点匹配代码举例,以及queryIdx和trainIdx的用法

opencv中 在特征点匹配代码举例,以及queryIdx和trainIdx的用法

时间:2024-07-13 22:51:33浏览次数:17  
标签:匹配 Point 特征 queryIdx matches opencv 图像 Match trainIdx

一、用法

在特征点匹配中,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

标签:匹配,Point,特征,queryIdx,matches,opencv,图像,Match,trainIdx
From: https://www.cnblogs.com/rainbow70626/p/18300889

相关文章

  • 使用Python配合OpenCV,非常简洁的来识别出银行卡号
        Opencv(OpenSourceComputerVisionLibrary)是一个基于开源发行的跨平台计算机视觉库。OpenCV用C++语言编写,它具有C++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和MacOS。本篇是使用python配合opencv来做图片识别,以识别银行卡上的卡号为例。   安装......
  • OpenCV一个简单的摄像头调用与关闭
    在使用OpenCV(OpenSourceComputerVisionLibrary)进行摄像头调用与关闭时,通常使用cv2.VideoCapture()函数来调用摄像头,并通过适当的方式关闭它。调用摄像头首先,需要导入OpenCV库(通常简写为cv2),并使用cv2.VideoCapture()函数来启动摄像头。这个函数可以接收一个整数作为参......
  • C#+OpenCV实战(三)_玉米粒计数
    ///<summary>///标注物体-物体计数标注///比如玉米粒计数并标注每个玉米///</summary>///<paramname="imgFile1"></param>///<returns>物体位置;数量=contours.Length</returns>publicstaticPoint[][]ImageDetector_CountAndLabel(MatsrcMa......
  • C#+OpenCV实战(四)_特定钢板缺陷检测
    ///<summary>///板材瑕疵检测(凹凸坑、划痕、颜料瑕疵)///</summary>///<paramname="mat">图片</param>///<paramname="resultMat">结果图片</param>///<paramname="minArcLength">最小有效斑弧长;默认为5</param>......
  • C#+OpenCV进阶(一)_人体识别
      效果排名:Lbp<Haar<CNN1、Lbp///<summary>///Lbp人脸识别///</summary>publicstaticMatFaceDetection_Lbp(Matmat){varlbpCascade=newCascadeClassifier("model/lbpcascade_frontalface.xml");MatoutMat=newMat();......
  • C#+OpenCV进阶(三)_操作摄像头与视频文件
    1、VideoCapture的常用属性#region常用属性//_=videoCapture.CaptureType;//获取视频的捕获类型(文件或摄像头)//_=videoCapture.PosAviRatio;//获取或设置视频的相对位置(0开头1结尾)//_=videoCapture.FourCC;//获取或设置视频的编解码的4字符代码//_=......
  • C#+OpenCV基础(十七)_计算图片相似度
    1、SSIM算法计算相似度///<summary>///两张图片的相似度(SSIM算法)///</summary>///<paramname="mat1">图片1</param>///<paramname="mat2">图片2</param>///<returns></returns>publicstaticScalarCompareD......
  • C#+OpenCV基础(十八)_模版匹配
    1、MatchTemplate匹配图片///<summary>///匹配图片(Cv2.MatchTemplate)///</summary>///<paramname="matSrc">图片</param>///<paramname="matTo">特征图片</param>///<paramname="outMat">结果图片<......
  • C#+OpenCV基础(十三)_图片白平衡矫正
    1、白平衡矫正-灰度幂律变换(伽马变换)///<summary>///白平衡矫正-灰度幂律变换(伽马变换)///对过曝和过暗的图片进行矫正///</summary>///<paramname="srcMat">图片</param>///<returns>返回黑白图片</returns>publicstaticMatWhiteBalance_PowerLaw_Transforma......
  • C#+OpenCV基础(十四)_绘制像素、图形、文字
    1、绘制直线///<summary>///绘制直线///</summary>///<paramname="mat">图片</param>///<paramname="startPoint">线段的第一个点</param>///<paramname="endPoint">线段的第二个点</param>///<par......