2015-10-06 3 views
13

Я пытаюсь запустить k-ближайших соседей, используя cv2 (python 2.7) и opencv 3.0. Я копировал же сообщение об ошибке с помощью кода, как http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_ml/py_knn/py_knn_understanding/py_knn_understanding.html:KNN train() в cv2 с opencv 3.0

import cv2 
import numpy as np 
import matplotlib.pyplot as plt 
# Feature set containing (x,y) values of 25 known/training data 
trainData = np.random.randint(0,100,(25,2)).astype(np.float32) 
# Labels each one either Red or Blue with numbers 0 and 1 
responses = np.random.randint(0,2,(25,1)).astype(np.float32) 
# Take Red families and plot them 
red = trainData[responses.ravel()==0] 
plt.scatter(red[:,0],red[:,1],80,'r','^') 
# Take Blue families and plot them 
blue = trainData[responses.ravel()==1] 
plt.scatter(blue[:,0],blue[:,1],80,'b','s') 
plt.show() 
newcomer = np.random.randint(0,100,(1,2)).astype(np.float32) 
plt.scatter(newcomer[:,0],newcomer[:,1],80,'g','o') 

#The following line is modified for OpenCV 3.0 
knn = cv2.ml.KNearest_create() 
knn.train(trainData,responses) 
ret, results, neighbours ,dist = knn.find_nearest(newcomer, 3) 

print "result: ", results,"\n" 
print "neighbours: ", neighbours,"\n" 
print "distance: ", dist 

plt.show() 

Я изменил линию КНН = cv2.ml.KNearest_create() для OpenCV 3, но последующая строка выдает ошибку «TypeError: только массивы длиной-1 могут быть преобразованы в скаляры Python », и я не могу понять, что я должен использовать для функции поезда.

ответ

25

Вы передаете неправильную длину массива для алгоритма KNN .... взглянув на ваш код, я обнаружил, что вы пропустили параметр cv2.ml.ROW_SAMPLE в функции knn.train, передав этот параметр, рассмотрим длину массива как 1 для целой строки. Таким образом, ваш исправленный код будет выглядеть следующим образом:

import cv2 
import numpy as np 
import matplotlib.pyplot as plt 

trainData = np.random.randint(0,100,(51,2)).astype(np.float32) 
responses = np.random.randint(0,2,(51,1)).astype(np.float32) 

red = trainData[responses.ravel()==0] 
plt.scatter(red[:,0],red[:,1],80,'r','^') 
blue = trainData[responses.ravel()==1] 
plt.scatter(blue[:,0],blue[:,1],80,'b','s') 


newcomer = np.random.randint(0,100,(5,2)).astype(np.float32) 
plt.scatter(newcomer[:,0],newcomer[:,1],80,'g','o') 

knn = cv2.ml.KNearest_create() 
knn.train(trainData,cv2.ml.ROW_SAMPLE,responses) 
ret, results, neighbours, dist = knn.findNearest(newcomer, 3) 

print ("results: ", results,"\n") 
print ("neighbours: ", neighbours,"\n") 
print ("distances: ", dist) 

plt.show() 

Вот результат, который я получил от него ....

KNN Output

+0

Я хочу upvote этого ответа, потому что он прекрасно работает. Но я не могу, потому что у меня недостаточно репутации. СПАСИБО! Я потратил слишком много времени, пытаясь понять это. –

+0

отметьте ответ как разрешенный, если он правильно работает – AdityaIntwala

Смежные вопросы