Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

OpenCV + Numpy Script

The issue I'm having is that the two scripts below are both outputting this error: https://i.sstatic.net/jAjqm.png

TypeError: FeatureDetector.detect() takes at most 2 arguments (3 given)

which I can avoid in the script 2 below by deleting:

useProvidedKeypoints = False 

from the end of

kp, descritors = surf.detect(imgg,None,useProvidedKeypoints = False)

which leads to this error in the 2nd script :https://i.sstatic.net/CyMTF.png

TypeError: float() argument must be a string or a number

And this error in the first script: i.imgur.com/UVzNvP1.png (2 link limit add manually)

TypeError: trainData data type = 17 is not supported

Any help would be greatly appreciated and the main thing I want to come out of this is with a script I can tweak and edit till I understand the functions involved slightly better.

Summary; I'm not really sure why kp, descritors = surf.detect(imgg,None,useProvidedKeypoints = False) is telling me there too many arguments because the person who helped me write this seemed to think this should work.

1

import cv2
import numpy as np

img =cv2.imread('win18.jpg')

imgg =cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

surf = cv2.SURF()
kp, descritors = surf.detect(imgg,None,useProvidedKeypoints = False)


samples = np.array(descritors)
responses = np.arange(len(kp),dtype = np.float32)


knn = cv2.KNearest()
knn.train(samples,responses)


template = cv2.imread('win17.jpg')
templateg= cv2.cvtColor(template,cv2.COLOR_BGR2GRAY)
keys,desc = surf.detect(templateg,None,useProvidedKeypoints = False)


for h,des in enumerate(desc):
    des = np.array(des,np.float32).reshape((1,128))
    retval, results, neigh_resp, dists = knn.find_nearest(des,1)
    res,dist =  int(results[0][0]),dists[0][0]


    if dist<0.1: 
        color = (0,0,255)
    else: 
        print dist
        color = (255,0,0)


    x,y = kp[res].pt
    center = (int(x),int(y))
    cv2.circle(img,center,2,color,-1)

    x,y = keys[h].pt
    center = (int(x),int(y))
    cv2.circle(template,center,2,color,-1)


cv2.imshow('img',img)
cv2.imshow('tm',template)
cv2.waitKey(0)
cv2.destroyAllWindows()

2

import cv2
import numpy

opencv_haystack =cv2.imread('win12.jpg')
opencv_needle =cv2.imread('win1.jpg')

ngrey = cv2.cvtColor(opencv_needle, cv2.COLOR_BGR2GRAY)
hgrey = cv2.cvtColor(opencv_haystack, cv2.COLOR_BGR2GRAY)


hessian_threshold = 85
detector = cv2.SURF(hessian_threshold)
(hkeypoints, hdescriptors) = detector.detect(hgrey, None, useProvidedKeypoints = False)
(nkeypoints, ndescriptors) = detector.detect(ngrey, None, useProvidedKeypoints = False)


rowsize = len(hdescriptors) / len(hkeypoints)
if rowsize > 1:
    hrows = numpy.array(hdescriptors, dtype = numpy.float32).reshape((-1, rowsize))
    nrows = numpy.array(ndescriptors, dtype = numpy.float32).reshape((-1, rowsize))

else:
    hrows = numpy.array(hdescriptors, dtype = numpy.float32)
    nrows = numpy.array(ndescriptors, dtype = numpy.float32)
    rowsize = len(hrows[0])


samples = hrows
responses = numpy.arange(len(hkeypoints), dtype = numpy.float32)

knn = cv2.KNearest()
knn.train(samples,responses)



    if dist < 0.1:

        color = (0, 0, 255)
    else:

        color = (255, 0, 0)

    x,y = hkeypoints[res].pt
    center = (int(x),int(y))
    cv2.circle(opencv_haystack,center,2,color,-1)

    x,y = nkeypoints[i].pt
    center = (int(x),int(y))
    cv2.circle(opencv_needle,center,2,color,-1)

cv2.imshow('haystack',opencv_haystack)
cv2.imshow('needle',opencv_needle)
cv2.waitKey(0)
cv2.destroyAllWindows()
like image 622
Dave Avatar asked Jan 24 '26 17:01

Dave


1 Answers

Hi I know it's late but for the ones still facing the problem, try replacing detect() with detectAndCompute().
I got the error removed this way.

like image 55
ateeq Avatar answered Jan 27 '26 05:01

ateeq



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!