python - 带有opencv 3.0的cv2中的KNN train()

标签 python opencv3.0 knn

我正在尝试使用 cv2 (python 2.7) 和 opencv 3.0 运行 k 最近邻。我使用 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()

我为 OpenCV 3 修改了 knn = cv2.ml.KNearest_create() 行,但后续行会产生错误“TypeError: only length-1 arrays can be convert to Python scalars”和我不知道应该为 train 函数使用什么。

最佳答案

您为 KNN 算法传递了错误的数组长度....查看您的代码,我发现您错过了 knn.train 函数中的 cv2.ml.ROW_SAMPLE 参数,传递此参数将数组的长度视为1 代表整行。因此您更正的代码如下:

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

这是我从中得到的结果......

KNN Output

关于python - 带有opencv 3.0的cv2中的KNN train(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32980675/

相关文章:

python - 如何使用python脚本读取XLSX文件特定列中的数据

java - 是什么导致 opencv_traincascade.exe 在获取负样本时崩溃?

python-3.x - 解决环境: failed

c++ - 添加 float openCV3.0

python - 如何调整此代码以同时返回第二个和第三个 "Nearest Neighbors"?

opencv - 对于 BoW 模型中的 ORB,L2 范数比 Hamming 效果更好,为什么?

python - 为什么 tkinter 在销毁实例时不释放内存?

python - Pyspark:如何过滤两列值对的列表?

r - 使用 R 查找仅一个点(不是整个矩阵)的 k 最近邻

python - 从 URL 检索文件而不先将其加载到 RAM 中