You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:33:20