2015-10-06 19 views
13

Sto provando a eseguire i k-neighbor vicini usando cv2 (python 2.7) e opencv 3.0. Ho replicato lo stesso messaggio di errore utilizzando il codice come http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_ml/py_knn/py_knn_understanding/py_knn_understanding.html:Treno KNN() in cv2 con 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() 

ho modificato la linea knn = cv2.ml.KNearest_create() per OpenCV 3, ma la linea successiva produce un TypeError errore": solo gli array di lunghezza 1 possono essere convertiti in scalari Python "e non riesco a capire cosa dovrei usare per la funzione del treno.

risposta

25

Stai passando una lunghezza errata dell'array per l'algoritmo KNN .... dando uno sguardo al tuo codice, ho scoperto che hai perso il parametro cv2.ml.ROW_SAMPLE nella funzione knn.train, passando questo parametro considera la lunghezza dell'array come 1 per l'intera riga. così il vostro codice corretto sarebbe come di seguito:

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

Ecco il risultato che ho ottenuto da esso ....

KNN Output

+0

Voglio upvote questa risposta, perché funziona perfettamente. Ma non posso perché non ho abbastanza reputazione. GRAZIE! Ho passato troppo tempo a cercare di capirlo. –

+0

contrassegna la risposta come risolta se funziona correttamente – AdityaIntwala

Problemi correlati