0

我正在尝试使用词汇树实现可扩展识别, 并且我正在使用 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);

所以在函数中填充“中心”和“标签”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。

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

此外,如果您有该论文的任何良好实现的链接,如果您将其发布在这里,我将不胜感激。

4

1 回答 1

0

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

于 2013-08-15T04:30:13.120 回答