训练时在OpenCV上遇到KNN问题,new_samples.type()== CV_32F

时间:2019-06-19 09:21:14

标签: numpy opencv python-3.7

我正在尝试使用三类数据集设置一个简单的KNN问题实现,但是每当我尝试执行train函数时,我都会保留所说的(-215:Assertion failed) new_samples.type() == CV_32F in function 'cv::ml::Impl::train error.

我尝试将响应数组重塑为许多不同的东西,因为大多数错误来自代码的那部分,即从1 x n矩阵到单个列表。我正在关注本教程。就像定义三个类一样,我可以通过定义自己的数据来实现两个类,但是我无法设法训练三个类。

import numpy as np 
import cv2 as cv 

classA=([(10,1,1),(9,2,2),(11,1,2),(8,3,2),(7,2,3),(8,5,4),(9,3,4),(6,6,5),(8,6,6),(9,7,7)])
classB=([(5,1,20),(5,2,19),(5,1,21),(4,2,18),(4,1,19),(6,3,20),(6,2,19),(4,4,18),(4,5,21),(6,4,19)])
classC=([(5,14,10),(6,13,9),(4,12,11),(6,11,9),(6,7,12),(7,6,13),(7,7,10), (7,8,11),(8,8,12),(7,6,11)])

points = classA + classB + classC
responses = ([0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2])

# Using numpy's array?
points_np = np.asarray(points)
responses_np = np.asarray(responses).reshape((30,1))
#print(points_np)
#print(responses_np)

knn = cv.ml.KNearest_create()
knn.train(points_np, cv.ml.ROW_SAMPLE, responses_np)

我知道样本数据和响应数据都应遵循类似的结构,因此该函数可以将每个点关联到一个类,但是我认为我的问题在于我用于响应变量的结构类型。 我应该如何调整或设置响应变量,以便火车功能可以读取?

1 个答案:

答案 0 :(得分:0)

如断言中所述,样本的数据类型必须为CV_32F,代表32位浮点数。

points_np = np.asarray(points).astype(np.float32)
responses_np = np.asarray(responses).reshape((30,1)).astype(np.float32)