opencv kmeans不对某些类中的数据进行分类

时间:2013-07-27 08:03:36

标签: opencv k-means

我正在尝试实现Scalable Recognition with a Vocabulary Tree 并且我正在使用opencv kmeans函数来聚类特征向量,因此我将所有向量放在一个Mat对象中并将其传递给函数,如下所示:

TermCriteria criteria;
criteria.epsilon = 0.1;
int attempts = 1;
int flags = KMEANS_RANDOM_CENTERS;
int K = 10;
Mat Centers;
Mat Labels;

kmeans(descriptors, K, Labels, criteria, attempts, flags, Centers);

因此在函数中填充“Centers”和“Labels”Mat对象如下:

Centers has K rows, 64 columns (I'm using SURF features) and one channel

Labels has as many rows as "descriptors", one column and one channel and it's values are in the range of [0 K-1]

这些是我检查的内容。在对所有向量执行此操作后,我将具有相同标签的向量复制到新Mat并再次将其传递给函数。

我的问题是,有时“标签”中缺少[0 k-1]范围内的一个值,因此没有任何特征向量被归类在该群集中。我已经检查了它的不同K和它通常至少在某个级别发生过一次(从来没有在第一次通话中)。即使K = 3。

我假设在那些时候传递给函数的数据不对。所以我的问题是,什么时候会发生这种情况?我应该检查哪些内容传递给函数以确保它们有效?

此外,如果您有任何良好的论文实施链接,如果您在此发布,我将非常感激。

1 个答案:

答案 0 :(得分:0)

事实证明,有些集群中的某些集群的成员数少于K个,因此在下一级别,该函数会返回错误。虽然我还没弄清楚为什么有时群集是空的。