如何在OpenCV Python中通过特征匹配获取像素坐标

如何在OpenCV Python中通过特征匹配获取像素坐标,python,opencv,image-processing,matching,feature-detection,Python,Opencv,Image Processing,Matching,Feature Detection,我需要获得特征匹配器在提供的代码中选择的像素的x和y坐标列表。我正在使用Python和OpenCV。有人能帮我吗 img1=cv2.imread('DSC_0216.jpg',0) img2=cv2.imread('DSC_0217.jpg',0) orb=cv2.ORB(nfeatures=100000) kp1,des1=orb.detectAndCompute(img1,None) kp2,des2=orb.detectAndCompute(img2,None) img1kp=cv2.

我需要获得特征匹配器在提供的代码中选择的像素的
x
y
坐标列表。我正在使用Python和OpenCV。有人能帮我吗

img1=cv2.imread('DSC_0216.jpg',0)
img2=cv2.imread('DSC_0217.jpg',0)

orb=cv2.ORB(nfeatures=100000)
kp1,des1=orb.detectAndCompute(img1,None)
kp2,des2=orb.detectAndCompute(img2,None)

img1kp=cv2.drawKeypoints(img1,kp1,color=(0,255,0),flags=0)
img2kp=cv2.drawKeypoints(img2,kp2,color=(0,255,0),flags=0)
cv2.imwrite('m_img1.jpg',img1kp)
cv2.imwrite('m_img2.jpg',img2kp)

bf=cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches=bf.match(des1,des2)
matches=sorted(matches, key= lambda x:x.distance)

我们知道您的关键点存储在
kp1
kp2
中,它们分别是第一个和第二个图像的特征匹配列表。在
cv2.ORB
透视图中,特征描述符是2D矩阵,其中每一行是在第一个和第二个图像中检测到的关键点

在您的情况下,因为您使用的是
cv2.BFMatch
matches
返回
cv2.DMatch
对象列表,其中每个对象包含多个成员,其中有两个重要成员:

  • queryIdx
    -匹配的
    kp1
    兴趣点矩阵的索引或
  • trainIdx
    -匹配的
    kp2
    兴趣点矩阵的索引或
因此,
queryIdx
trainIdx
会告诉您第一个图像和第二个图像之间匹配的ORB特征。您可以使用它们索引到
kp1
kp2
,并获得
pt
成员,它是确定匹配的实际空间坐标的
(x,y)
坐标的元组

您所要做的就是迭代
匹配中的每个
cv2.DMatch
对象,将其附加到
kp1
kp2
的坐标列表中,就完成了

大概是这样的:

# Initialize lists
list_kp1 = []
list_kp2 = []

# For each match...
for mat in matches:

    # Get the matching keypoints for each of the images
    img1_idx = mat.queryIdx
    img2_idx = mat.trainIdx

    # x - columns
    # y - rows
    # Get the coordinates
    (x1, y1) = kp1[img1_idx].pt
    (x2, y2) = kp2[img2_idx].pt

    # Append to each list
    list_kp1.append((x1, y1))
    list_kp2.append((x2, y2))
请注意,我本可以完成
list\u kp1.append(kp1[img1\u idx].pt)
list\u kp2
的操作,但我想明确说明如何解释空间坐标。您还可以更进一步,做一个列表:

list_kp1 = [kp1[mat.queryIdx].pt for mat in matches] 
list_kp2 = [kp2[mat.trainIdx].pt for mat in matches]
list_kp1
将包含与
list_kp2
中相应位置匹配的特征点的空间坐标。换句话说,
list_kp1
的元素
i
包含
img1
中的特征点的空间坐标,该坐标与
list_kp2
中的
img2
中的相应特征点相匹配,其空间坐标在元素
i


作为次要的旁侧,我在写一个解决方案时使用了这个概念,因为对于OpenCV 2.4。x,Python包装器不存在C++函数,所以我利用上述概念在两个图像之间匹配特征的空间坐标来编写自己的实现。 如果你喜欢,就去看看吧