Скрипт OpenCV +

70
8

Проблема, с которой я сталкиваюсь, заключается в том, что оба сценария ниже приводят эту ошибку: https://i.imgur.com/sLH6Mv4.png

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

которую я могу избежать в сценарии 2 ниже, удалив:

useProvidedKeypoints = False 

с конца

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

что приводит к этой ошибке во втором скрипте: https://i.imgur.com/ap0odal.png

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

И эта ошибка в первом скрипте: i.imgur.com/UVzNvP1.png(2 лимита ссылок добавить вручную)

TypeError: trainData data type = 17 is not supported

Любая помощь была бы очень признательна, и главное, что я хочу вынести из этого, - это сценарий, который я могу настроить и отредактировать, пока не пойму, что функции немного улучшены.

Резюме; Я не уверен, почему kp, descritors = surf.detect(imgg,None,useProvidedKeypoints = False) говорит мне слишком много аргументов, потому что человек, который помог мне написать это, казалось, думал, что это должно сработать.

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()

спросил(а) 2014-05-15T14:45:00+04:00 6 лет, 4 месяца назад
1
Решение
57

Привет, я знаю это поздно, но для тех, кто все еще сталкивается с проблемой, попробуйте заменить detect() на detectAndCompute().
Я удалил эту ошибку.

ответил(а) 2016-05-17T00:35:00+03:00 4 года, 4 месяца назад
41

в случае сомнений,...

>>> s = cv2.SURF()
>>> help(s.detect)
Help on built-in function detect:

detect(...)
detect(image[, mask]) -> keypoints


поэтому ваши предположения об аргументах SURF.detect() были совершенно исключены.

ответил(а) 2014-05-15T15:07:00+04:00 6 лет, 4 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема