如何从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)

回答:

我们知道您的关键点分别存储在第一张和第二张图片的特征匹配列表中,kp1以及kp2它们的位置。从cv2.ORB角度来看,特征描述符是2D矩阵,其中每一行都是在第一张和第二张图像中检测到的关键点。

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

  • queryIdx-匹配的兴趣点矩阵的索引或 kp1
  • trainIdx-匹配的兴趣点矩阵的索引或 kp2

因此,queryIdxtrainIdx告诉你哪个ORB的特征,第一和第二图像之间的匹配。你会使用这些索引kp1kp2和获得pt成员,这是一个元组(x,y)决定比赛的实际空间坐标的坐标。

您所要做的就是遍历中的每个cv2.DMatch对象matcheskp1并为它们附加一个坐标列表,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_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。换句话说,元件ilist_kp1包含从特征点的空间坐标img1,从与对应的特征点匹配img2list_kp2其空间坐标是在元件i


作为次要说明,我在写变通方法时使用了这个概念,drawMatches因为对于OpenCV

2.4.x,不存在C ++函数的Python包装器,因此我在确定匹配特征的空间坐标时使用了上述概念。在两个图像之间编写我自己的实现。

如果喜欢,请检查一下!

模块’对象没有属性’drawMatches’opencv

python

以上是 如何从OpenCV Python中的功能匹配获取像素坐标 的全部内容, 来源链接: utcz.com/qa/422691.html

回到顶部