web-dev-qa-db-fra.com

Train KNN () en cv2 avec opencv 3.0

J'essaie d'exécuter k-voisins les plus proches en utilisant cv2 (python 2.7) et opencv 3.0. J'ai répliqué le même message d'erreur en utilisant du code comme http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_ml/py_knn/py_knn_understanding/py_knn_understanding.html :

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

J'ai modifié la ligne knn = cv2.ml.KNearest_create () pour OpenCV 3, mais la ligne suivante génère une erreur "TypeError: uniquement les tableaux de longueur 1 peut être converti en Python scalaires "et je ne sais pas ce que je devrais utiliser pour la fonction train.

21
Brad Foley

Vous passez une mauvaise longueur de tableau pour l'algorithme KNN .... en regardant votre code, j'ai constaté que vous avez manqué le paramètre cv2.ml.ROW_SAMPLE dans la fonction knn.train, en passant ce paramètre, la longueur du tableau est considérée comme 1 pour l'ensemble rangée. ainsi votre code corrigé serait comme ci-dessous:

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

Voici le résultat que j'en ai obtenu ....

KNN Output

38
AdityaIntwala