我需要得到特征匹配器在提供的代码中选择的像素的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
透视图中,这些是二维矩阵,其中每一行是在第一个图像kp1
和第二个图像kp2
中检测到的关键点。在您的例子中,因为您使用的是
cv2.BFMatch
,matches
返回一个cv2.DMatch
对象列表,其中每个对象包含多个成员。。。。其中有两个重要成员:queryIdx
-匹配的kp1
兴趣点矩阵的索引或行trainIdx
-匹配的kp2
兴趣点矩阵的索引或行因此,
queryIdx
和trainIdx
告诉您,kp1
和kp2
之间匹配的ORB功能。因此,您可以使用这些索引到kp1
和kp2
中,并获得pt
成员,它是确定匹配的实际空间坐标的(x,y)
坐标的元组。你所要做的就是遍历
matches
中的每个cv2.DMatch
对象,追加到kp1
和kp2
的坐标列表中,就完成了。像这样的:
注意,我本可以对
list_kp1.append(kp1[img1_idx].pt)
和list_kp2
做同样的操作,但我想非常清楚地说明如何解释空间坐标。你也可以更进一步,做一个列表理解:list_kp1
将包含与list_kp2
中相应位置匹配的特征点的空间坐标。换句话说,list_kp1
的元素i
包含来自img1
的特征点的空间坐标,该特征点与来自list_kp2
的img2
的对应特征点匹配,其空间坐标在元素i
中。作为次要旁瓣,当我为^{} 编写了一个解决方案时,我使用了这个概念,因为对于OpenCV 2.4 .x,Python包装器不存在C++函数,所以我利用上述概念在两个图像之间匹配特征的空间坐标来编写自己的实现。
如果你愿意的话,去看看!
module' object has no attribute 'drawMatches' opencv python
相关问题 更多 >
编程相关推荐