我正在尝试使用词汇树实现可扩展识别, 并且我正在使用 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。
我假设在那些时候我传递给函数的数据是不正确的。所以我的问题是,什么时候会发生这种情况?我应该检查传递给函数的数据以确保它们有效?
此外,如果您有该论文的任何良好实现的链接,如果您将其发布在这里,我将不胜感激。