TypeError: Argument given by name ('k') and position (2)
14,200
Solution 1
This worked for me
FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks=50)
flann = cv2.FlannBasedMatcher(index_params,search_params)
matches = flann.knnMatch(np.asarray(des1,np.float32),np.asarray(des2,np.float32),k=2)
Solution 2
You are trying to match keypoints and the descriptors - which is wrong. You need two images, first you find the keypoints in both of the images (points of interest). Then for each point you calculate a descriptor (again in both images). Finally, you use the Flann to find matches between the two images. See the example here.
Solution 3
Try to pass k
as positional argument:
matches = flann.knnMatch(kpTrain,desTrain,2)
Related videos on Youtube
Author by
shar
Updated on June 04, 2022Comments
-
shar almost 2 years
Find below my
opencv3
Python3 code to match objects which raises the following error:TypeError: Argument given by name ('k') and position (2)
Here's the code:
import numpy as np import cv2 import time import distance camera = cv2.VideoCapture(0) sift = cv2.xfeatures2d.SIFT_create() img = cv2.imread('/home/shar/bo.jpg') imgTrainGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) kpTrain = sift.detect(imgTrainGray,None) kpTrain, desTrain = sift.compute(imgTrainGray, kpTrain) FLANN_INDEX_KDTREE = 0 index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5) search_params = dict(checks=50) flann = cv2.FlannBasedMatcher(index_params,search_params) matches = flann.knnMatch(kpTrain,desTrain,k=2)
Ideas on how to fix it?
-
shar over 8 yearsTypeError: only length-1 arrays can be converted to Python scalars
-
kvorobiev over 8 years@shar What
kpTrain
anddesTrain
contains before function call? -
kvorobiev over 8 years@shar Try to use
matches = flann.knnMatch(np.asarray(kpTrain,np.float32),np.asarray(desTrain,np.float32),2)
-
shar over 8 yearsmatches = flann.knnMatch(np.asarray(kpTrain,np.float32),np.asarray(desTrain,np.float32),2) ^ SyntaxError: invalid character in identifier
-
kvorobiev over 8 years@shar Can you provide full error traceback in your question? I tried this code and did not get syntax errors
-
shar over 8 yearsFile "sk.py", line 16 matches = flann.knnMatch(np.asarray(kpTrain,np.float32),np.asarray(desTrain,np.float32),2) ^ SyntaxError: invalid character in identifier
-
kvorobiev over 8 years@shar Ok, lets try to do it in 3 lines:
des1 = np.asarray(kpTrain, np.float32) des2 = np.asarray(desTrain, np.float32) matches = flann.knnMatch(des1, des2, 2)
-
shar over 8 yearsFile "sk.py", line 18 matches = flann.knnMatch(des1, des2, 2) ^ SyntaxError: invalid character in identifier
-
kvorobiev over 8 years@shar Can you share you file?
-
kvorobiev over 8 years@shar I have not found in this file line
matches = flann.knnMatch(des1, des2, 2)
. Looks like it's another file -
kvorobiev over 8 years@shar Try just to retype this line
matches = flann.knnMatch(des1, des2, 2)
, without using copy/past -
shar over 8 yearsFile "sk.py", line 16, in <module> des1 = np.asarray(kpTrain, np.float32) File "/usr/local/lib/python3.4/dist-packages/numpy/core/numeric.py", line 462, in asarray return array(a, dtype, copy=False, order=order) TypeError: float() argument must be a string or a number, not 'cv2.KeyPoint'
-
Georg W. almost 6 yearsCan you give any deeper explanation for this error? What is causing it?