python opencv3.0 knn

python - Tren KNN() en cv2 con opencv 3.0



opencv3.0 (1)

Usted está pasando la longitud incorrecta de la matriz para el algoritmo KNN .... Al observar su código, descubrí que no había detectado el parámetro cv2.ml.ROW_SAMPLE en la función knn.train, al pasar este parámetro se considera que la longitud de la matriz es 1 para toda fila. Por lo tanto, su código corregido sería el siguiente:

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

Aquí está el resultado que obtuve de él ...

Estoy tratando de ejecutar k-vecinos más cercanos usando cv2 (python 2.7) y opencv 3.0. He replicado el mismo mensaje de error usando un código como 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()

Modifiqué la línea knn = cv2.ml.KNearest_create () para OpenCV 3, pero la línea siguiente produce un error "TypeError: solo los arrays de longitud-1 se pueden convertir a escalas de Python" y no puedo averiguar cuál debería ser Usando para la función de tren.