OpenCV KNN三类数据集训练报错:new_samples.type() == CV_32F断言失败
解决OpenCV KNN训练时的
new_samples.type() == CV_32F断言错误 你遇到的这个错误,核心原因其实不是responses的结构问题,而是样本数据(也就是points_np)的类型不符合OpenCV KNN的要求——它明确要求输入的样本必须是32位浮点型(CV_32F),而你的代码里生成的points_np是整数类型的数组,这就触发了断言失败。另外虽然你调整了responses的形状,我们也需要确保它的类型符合要求。
具体调整步骤:
- 转换样本数据为32位浮点型:把
points_np从整数数组转为np.float32类型,这是解决断言错误的关键。 - 确保responses是整数类型的列向量:虽然你已经把responses reshape成了(30,1),但最好显式指定它的类型为
np.int32,避免潜在的类型不匹配问题。
修改后的完整代码:
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]*10 + [1]*10 + [2]*10 # 简化写法,和原数据等价 # 转换样本为32位浮点型,responses转为32位整数的列向量 points_np = np.asarray(points, dtype=np.float32) responses_np = np.asarray(responses, dtype=np.int32).reshape((-1, 1)) # 用-1自动计算行数,更灵活 knn = cv.ml.KNearest_create() knn.train(points_np, cv.ml.ROW_SAMPLE, responses_np)
为什么之前两类数据能成功?
大概率是你之前的两类数据集在转换为numpy数组时,不小心变成了浮点型(比如数据里有小数),或者你当时隐式做了类型转换,而这次三类数据全是整数,导致数组类型为int,触发了错误。
额外验证小技巧:
你可以在训练前打印一下数据的类型和形状,确认是否符合要求:
print("样本类型:", points_np.dtype) # 应该输出float32 print("样本形状:", points_np.shape) # 应该是(30, 3) print("标签类型:", responses_np.dtype) # 应该输出int32 print("标签形状:", responses_np.shape) # 应该是(30, 1)
内容的提问来源于stack exchange,提问作者Antonio Aguirre Ivorra
相关产品推荐
相关产品推荐

