When I tried to use drawMatchesKnn function as mentioned in this tutorial for FLANN feature matching, I get the following error
AttributeError: \'modu
You need to use OpenCV version 3. drawMatchesKnn()
is present in 3.0.0-alpha but not in 2.4.11
That error is there, because you are using an old version of OpenCV.
The functions cv2.drawMatches
and cv2.drawMatchesKnn
are not available in newer versions of OpenCV 2.4. @rayryeng provided a lightweight alternative which works as is for the output of DescriptorMatcher.match
. The difference with DescriptorMatcher.knnMatch
is that the matches are returned as a list of lists. To use the @rayryeng alternative, the matches must be extracted into a 1-D list.
For example, the Brute-Force Matching with SIFT Descriptors and Ratio Test tutorial could be amended as such:
# BFMatcher with default params
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1,des2, k=2)
# Apply ratio test
good = []
for m,n in matches:
if m.distance < 0.75*n.distance:
# Removed the brackets around m
good.append(m)
# Invoke @rayryeng's drawMatches alternative, note it requires grayscale images
gray1 = cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
drawMatches(gray1,kp1,gray2,kp2,good)