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)
IMP - This tutorial is meant for OpenCV 3x version. Not OpenCV 2x, it says clearly on the README page. You didn't read that? - bad_keypointscv2.SIFT()that don't exist in 3x (needs to be compiled with contrilbs and callled likecv2.xfeatures2d.SIFT_create(), so the tutorials are just a mess of old and new and few really work without changes. - tiagosilva