2016-11-06 1 views
1

Ich habe versucht, das Beispiel auf der docs Seite Funktion zu erhalten (http://docs.opencv.org/3.1.0/d5/d26/tutorial_py_knn_understanding.html)Python OpenCV 3.1: KNN nicht mit dem Beispiel in docs Arbeits

cv2.KNearest() wurde mit cv2.ml.KNearest_create ersetzt()

Das folgende Code-Snippet führt jedoch immer noch zu einem Fehler.

#!/usr/bin/python3 
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') 

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

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

bekomme ich folgende Fehler bei der Ausführung:

Traceback (most recent call last): 
    File "./knn_test.py", line 24, in <module> 
    knn.train(trainData,responses) 
TypeError: only length-1 arrays can be converted to Python scalars 

Die knn.train() Funktion

>>> knn.train.__doc__ 
'train(trainData[, flags]) -> retval or train(samples, layout, responses) -> retval' 

erwartet konnte ich nicht ein Beispiel für die Layout-Definition finden. Was ist die Änderung erforderlich, damit es funktioniert? Vielen Dank im Voraus!

Antwort

1

KNN Der Klassifikator ist aus der

StatModel 

Basisklasse

abgeleitet.

Der

layout 

Spezifizierer ist eine ganze Zahl, die das Modell sagt, wenn eine einzelne Probe eine Zeile oder eine Spalte befindet (siehe StatModel::train und ml::SampleTypes).

Da Sie 25 Reihen von Proben haben, werden Sie

cv2.ml.ROW_SAMPLE 
+0

Vielen Dank! Eine andere Sache, die geändert werden muss, ist find_nearest wurde geändert, um Nearest zu finden. (Nur für die Vollständigkeit der Antwort). –

0

passieren müssen Wenn Sie die endgültige Code suchen, die, basierend auf S1H Antwort und Anupam Sobti Kommentar funktioniert:

import numpy as np 
import cv2 

img = cv2.imread('digits.png') 
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 

# Split the image to 5000 cells, each 20x20 size 
cells = [np.hsplit(row, 100) for row in np.vsplit(gray, 50)] 

# Make it into a Numpy array. It size will be (50, 100, 20, 20) 
x = np.array(cells) 

# Now we prepare train_data and test_data. 
train = x[:, :50].reshape(-1, 400).astype(np.float32) # Size = (2500,400) 
test = x[:, 50:100].reshape(-1, 400).astype(np.float32) # Size = (2500,400) 

# Create labels for train and test data 
k = np.arange(10) 
train_labels = np.repeat(k, 250)[:, np.newaxis] 
test_labels = train_labels.copy() 

# Initiate the kNN, train the data, then test it with test data for k=1 
knn = cv2.ml.KNearest_create() 
knn.train(train, cv2.ml.ROW_SAMPLE, train_labels) 
ret, result, neighbours, dist = knn.findNearest(test, k=5) 

# Now we check the accuracy of classification 
# For that, compare the result with test_labels and check which are wrong 
matches = result == test_labels 
correct = np.count_nonzero(matches) 
accuracy = correct * 100.0/result.size 
print("accuracy") 
print(accuracy) 
Verwandte Themen