I need to get the list of the x and y coordinates of the pixels that the feature matcher selects in the code provided. I'm using Python and OpenCV. Can anyone help me?
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)
We know that your keypoints are stored in
kp1andkp2where they are lists of feature matches for the first and second image respectively. In thecv2.ORBperspective, the feature descriptors are 2D matrices where each row is a keypoint that is detected in the first and second image.In your case because you are using
cv2.BFMatch,matchesreturns a list ofcv2.DMatchobjects where each object contains several members and among them are two important members:queryIdx- The index or row of thekp1interest point matrix that matchestrainIdx- The index or row of thekp2interest point matrix that matchesTherefore,
queryIdxandtrainIdxtell you which ORB features match between the first and second image. You'd use these to index intokp1andkp2and obtain theptmember, which is a tuple of(x,y)coordinates that determine the actual spatial coordinates of the matches.All you have to do is iterate through each
cv2.DMatchobject inmatches, append to a list of coordinates for bothkp1andkp2and you're done.Something like this:
Note that I could have just done
list_kp1.append(kp1[img1_idx].pt)and the same forlist_kp2, but I wanted to make it very clear on how to interpret the spatial coordinates. You could also go one step further and do a list comprehension:list_kp1will contain the spatial coordinates of a feature point that matched with the corresponding position inlist_kp2. In other words, elementioflist_kp1contains the spatial coordinates of the feature point fromimg1that matched with the corresponding feature point fromimg2inlist_kp2whose spatial coordinates are in elementi.As a minor sidenote, I used this concept when I wrote a workaround for
drawMatchesbecause for OpenCV 2.4.x, the Python wrapper to the C++ function does not exist, so I made use of the above concept in locating the spatial coordinates of the matching features between the two images to write my own implementation of it.Check it out if you like!
module' object has no attribute 'drawMatches' opencv python