我正在尝试实现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。
我假设在那些时候传递给函数的数据不对。所以我的问题是,什么时候会发生这种情况?我应该检查哪些内容传递给函数以确保它们有效?
此外,如果您有任何良好的论文实施链接,如果您在此发布,我将非常感激。
答案 0 :(得分:0)
事实证明,有些集群中的某些集群的成员数少于K个,因此在下一级别,该函数会返回错误。虽然我还没弄清楚为什么有时群集是空的。