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)
Share:
14,200

Related videos on Youtube

shar
Author by

shar

Updated on June 04, 2022

Comments

  • shar
    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
    shar over 8 years
    TypeError: only length-1 arrays can be converted to Python scalars
  • kvorobiev
    kvorobiev over 8 years
    @shar What kpTrain and desTrain contains before function call?
  • kvorobiev
    kvorobiev over 8 years
    @shar Try to use matches = flann.knnMatch(np.asarray(kpTrain,np.float32),np.asarray(des‌​Train,np.float32),2)
  • shar
    shar over 8 years
    matches = flann.knnMatch(np.asarray(kpTrain,np.float32),np.asarray(des‌​Train,np.float32),2)‌​‌​ ^ SyntaxError: invalid character in identifier
  • kvorobiev
    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
    shar over 8 years
    File "sk.py", line 16 matches = flann.knnMatch(np.asarray(kpTrain,np.float32),np.asarray(des‌​Train,np.float32),2)‌​‌​ ^ SyntaxError: invalid character in identifier
  • kvorobiev
    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
    shar over 8 years
    File "sk.py", line 18 matches = flann.knnMatch(des1, des2, 2)‌ ^ SyntaxError: invalid character in identifier
  • kvorobiev
    kvorobiev over 8 years
    @shar Can you share you file?
  • kvorobiev
    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
    kvorobiev over 8 years
    @shar Try just to retype this line matches = flann.knnMatch(des1, des2, 2)‌, without using copy/past
  • shar
    shar over 8 years
    File "sk.py", line 16, in <module> des1 = np.asarray(kpTrain, np.float32) File "/usr/local/lib/python3.4/dist-packages/numpy/core/numeric.p‌​y", 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.
    Georg W. almost 6 years
    Can you give any deeper explanation for this error? What is causing it?