可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
When I run my python code
import numpy as np import cv2 import matplotlib.pyplot as plt img1 = cv2.imread('/home/shar/home.jpg',0) # queryImage img2 = cv2.imread('/home/shar/home2.jpg',0) # trainImage # Initiate SIFT detector sift = cv2.xfeatures2d.SIFT_create() # find the keypoints and descriptors with SIFT kp1, des1 = sift.detectAndCompute(img1,None) kp2, des2 = sift.detectAndCompute(img2,None) # 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
From this line
img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,flags=2)
I get this error
TypeError: Required argument 'outImg' (pos 6) not found
I am using python3 and opencv3
回答1:
You seem to be following this tutorial page (based on the code you've shown in this and your two related questions 1, 2).
The function documentation is here (although I note it is still labelled "beta") and implies that outImg
is optional. However, the python error message is explicit - an argument is required in position 6, it is named outImg
in the function signature. I suspect the documentation may not exactly match the code requirements. It appears that the signature of the C++ code that the python binding is calling has no default value for outImg
, so need that argument to be supplied.
Note that you can inspect the doc string for the actual binding in the python3 interpreter (if it exists) by looking at .__doc__
. In this case, you can see that outImg
is not shown as optional. Here is the output from my installation:
>>> cv2.drawMatchesKnn.__doc__ 'drawMatchesKnn(img1, keypoints1, img2, keypoints2, matches1to2, outImg[, matchC olor[, singlePointColor[, matchesMask[, flags]]]]) -> outImg'
Solution (note - verified on a windows install, not Linux)
You might note the last example on that tutorial, which uses the following code - passing in None
in the place of outImg
. I think that will work for your case also.
draw_params = dict(matchColor = (0,255,0), singlePointColor = (255,0,0), matchesMask = matchesMask, flags = 0) img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,matches,None,**draw_params)
You don't need to pass all the draw_params
dict, you could try just passing flags
i.e.
img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,matches,None,flags=2)
I have verified this on a fresh install of OpenCV 3 (albeit on Windows, using a prebuilt binary)
回答2:
Okay guys , I am too a newbie and learning a lot after hours of research online it appears to be a BUG on a error know as Error (-255) NumpyAllocator , many site will suggest you open cv2.cpp file and comment out the line 163 code , my suggestion is if you are using OpenCV 3.1 download grade to OpenCV 3.0.0
the bug seems to be within OpenCV 3.1 in addition to this the code for using ORB Algorithm which is documented on OpenCV.org is a bit outdated where it states enter code here
# Initiate ORB detector enter code here
orb = cv2.ORB() # note you will get a error as this has now enter code here
change to : enter code here
orb = cv2.ORB_create()
Here is my example of the code using OpenCV 3.0.0 on Windows 10 :
# Example of Brute Force matching base on ORB Algorithm #Modify Author : Waheed Rafiq R&D student Birmingham City University UK #Original author : OpenCV.org #Date Updated : 21/04/2016 : 13:45 import numpy as np import cv2 from matplotlib import pyplot as plt img1 = cv2.imread('wr-pb.jpg',0) # queryImage img2 = cv2.imread('Waheed.jpg',0) # trainImage # Initiate ORB detector orb = cv2.ORB_create() # find the keypoints and descriptors with ORB kp1, des1 = orb.detectAndCompute(img1,None) kp2, des2 = orb.detectAndCompute(img2,None) # create BFMatcher object bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) # Match descriptors. matches = bf.match(des1,des2) # Sort them in the order of their distance. matches = sorted(matches, key = lambda x:x.distance) # Draw first 10 matches. img3 = cv2.drawMatches(img1,kp1,img2,kp2,matches ,None, flags=2) plt.imshow(img3),plt.show()
I hope this helps , I love stack Over flow its the best resource out on internet.