2016-11-06 5 views
1

나는 문서 페이지 작업 (http://docs.opencv.org/3.1.0/d5/d26/tutorial_py_knn_understanding.html)파이썬을 OpenCV 3.1 :) (

cv2.KNearest()에 대한 예제를 얻으려고 노력했다가 cv2.ml.KNearest_create으로 대체 된 문서의 예 작동하지 KNN

그러나 다음 코드 스 니펫은 여전히 ​​오류가 발생합니다.

#!/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() 

나는 실행에 다음과 같은 오류가 다음 knn.train() 함수는

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

내가 레이아웃 정의의 예를 찾을 수 없습니다 것으로 예상

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 

. 작동시키기 위해 필요한 변경 사항은 무엇입니까? 미리 감사드립니다.

답변

1

KNN 분류는

StatModel 

베이스 클래스로부터 파생한다.

layout 

지정자

은 ( StatModel::trainml::SampleTypes 참조) 단일 샘플은 하나의 열 또는 하나의 열을 차지한다면 모델 지시 정수이다. 당신은 샘플의 25 개 행을 가지고 있기 때문에 당신이 작동 최종 코드를 찾고 있다면

, 당신은 s1h의 대답과 Anupam Sobti의 의견에 따라,

cv2.ml.ROW_SAMPLE 
+0

고맙습니다! 변경이 필요한 또 다른 사항은 find_nearest가 findNearest로 변경되었습니다. (답변의 완성을 위해서). –

0

을 통과해야합니다 :

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)