【问题标题】:OpenCV kmeans: N>=K exception, error (-215)OpenCV kmeans:N>=K 异常,错误 (-215)
【发布时间】:2015-03-22 18:33:04
【问题描述】:

当我尝试使用 kmeans 时:

int K = 4;
Mat labels;
Mat centers;
std::vector<float> values;

// (put a bunch of values into "values" here...)

kmeans(values, K, labels, TermCriteria(TermCriteria::COUNT + TermCriteria::EPS, 10, 1.0), 10, KMEANS_PP_CENTERS, centers);

我收到错误:“错误:(-215) N >= K in function kmeans”

values.size() = 360000,所以 N 明显大于 K。什么给出?谢谢。

【问题讨论】:

  • 这可能是一个愚蠢的评论,但您使用的是red_values 而不是values。您输入的red_values 的大小是多少?
  • 这是 Stackoverflow 输入错误!固定的!对不起,谢谢。 :-)
  • 嗯...在调用kmeans 之前,您是否检查过valuesK 的大小?我知道您已经在帖子中放置了大小,但是您是否实际放入了调试语句或使用调试器检查以验证 valuesK 的大小?仅当数据集中的点数少于所需的聚类数时,才会产生该错误。此外,每个数据点占据一行,而每一列都是一个变量。您是否以这种方式排列数据?您是否确保每一行代表一个数据点?
  • 是的-就在kmeans之前,K == 4和values == 360000。我想我不确定您在第二点中的意思。值只是一个向量...关于标签和中心我需要指定什么吗?
  • 看看下面安德烈的评论。我以为您在输入矩阵,但您使用的是vector(实际上,我从您的原始帖子中错过了这个)。您需要更改您的数据,使其成为一个包含 1 列的矩阵。

标签: opencv k-means


【解决方案1】:

OpenCV 奇怪地将一维数据解释为 1 元素数组。

以下内容应该可以解决此问题:

kmeans(cv::Mat(values).reshape(1, values.size()), K, labels, TermCriteria(TermCriteria::COUNT + TermCriteria::EPS, 10, 1.0), 10, KMEANS_PP_CENTERS, centers);

【讨论】:

    【解决方案2】:

    我遇到了同样的问题。

    这对我有用。 将向量转换为 Mat。

    int K = 4;
    Mat labels;
    Mat centers;
    std::vector<float> values;
    Mat points=Mat(values,true);
    points.convertTo(points, CV_32F);
    kmeans(points, K, labels, TermCriteria(TermCriteria::COUNT + TermCriteria::EPS, 10, 1.0), 10, KMEANS_PP_CENTERS, centers);
    

    【讨论】:

      猜你喜欢
      • 2016-06-20
      • 1970-01-01
      • 2017-11-07
      • 2013-12-24
      • 2018-04-30
      • 2017-03-02
      • 1970-01-01
      • 1970-01-01
      • 2019-12-04
      相关资源
      最近更新 更多