Knearest()函数在opencv 2.4.8和python 2.7.5中不起作用

时间:2015-02-13 07:10:27

标签: python opencv

我在Ubuntu 14.04中使用OpenCV 2.4.8和python 2.7.5

当我打电话

knn=cv2.KNearest()

我收到错误说

knn=cv2.KNearest() AttributeError: 'module' object has no attribute 'KNearest'

我该如何解决? 完整代码在这里

 import cv2
 import numpy as np
 #######   training part    ############### 
 samples = np.loadtxt('generalsamples.data',np.float32)
 responses = np.loadtxt('generalresponses.data',np.float32)
 responses = responses.reshape((responses.size,1))

 model = cv2.KNearest()

 model.train(samples,responses)
#######################测试部分
im = cv2.imread('training_images/number1.jpg')
out = np.zeros(im.shape,np.uint8)
gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
thresh = cv2.adaptiveThreshold(gray,255,1,1,11,2)

image,contours,hierarchy =       cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)

for cnt in contours:
    if cv2.contourArea(cnt)>50:
        [x,y,w,h] = cv2.boundingRect(cnt)
        if  h>28:
            cv2.rectangle(im,(x,y),(x+w,y+h),(0,255,0),2)
            roi = thresh[y:y+h,x:x+w]
            roismall = cv2.resize(roi,(10,10))
            roismall = roismall.reshape((1,100))
            roismall = np.float32(roismall)
            retval, results, neigh_resp, dists =            model.find_nearest(roismall, k = 1)
            string = str(int((results[0][0])))
            cv2.putText(out,string,(x,y+h),0,1,(0,255,0))

cv2.imshow('im',im)
cv2.imshow('out',out)
cv2.waitKey(0) & 0 x FF

2 个答案:

答案 0 :(得分:1)

这是调用KNearest()的正确方法,因此你做错了其他事情。

以下是使用[here]中的k-Nearest Neighbors的完整工作示例。

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

knn = cv2.KNearest()
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()

如果这不起作用,那么你就会遇到更大的问题。

答案 1 :(得分:1)

我已经解决了这个问题。问题出在opencv版本中。这就是为什么它没有识别KNN功能的原因。我已经安装了opencv 2.4.10,它运行正常。谢谢大家。