如何从OpenCV Python中的特征匹配中获取像素坐标

我需要获取特征匹配器在提供的代码中选择的像素的xy坐标列表。 我正在使用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)

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

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

  • queryIdx - 匹配的kp1兴趣点矩阵的索引或
  • trainIdx - 匹配的kp2兴趣点矩阵的索引或
  • 因此, queryIdxtrainIdx告诉您哪些ORB功能在kp1kp2之间匹配。 因此,您可以使用这些索引来索引kp1kp2并获取pt成员,该成员是确定匹配的实际空间坐标的(x,y)坐标的元组。

    你所要做的就是遍历每个matches cv2.DMatch对象,追加到kp1kp2的坐标列表中,你就完成了。

    像这样的东西:

    # 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_kp1.append(kp1[img1_idx].pt) ,对于list_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其空间坐标位于元素i img2的对应特征点匹配。


    作为一个小副作用,当我为drawMatches编写解决方法时,我使用了这个概念,因为对于OpenCV 2.4.x,C ++函数的Python包装不存在,所以我使用上述概念来定位匹配的空间坐标两个图像之间的特征写我自己的实现它。

    如果你喜欢,请看看!

    模块'对象没有'drawMatches'opencv python属性

    链接地址: http://www.djcxy.com/p/89741.html

    上一篇: How to get pixel coordinates from Feature Matching in OpenCV Python

    下一篇: show images returned from drawMatches