【发布时间】:2013-07-27 13:37:59
【问题描述】:
我正在尝试实现 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。
我假设在那些时候我传递给函数的数据是不正确的。所以我的问题是,什么时候会发生这种情况?我应该对传递给函数的数据进行哪些检查以确保它们有效?
另外,如果你有任何好的论文实现的链接,如果你在这里发布,我将不胜感激。
【问题讨论】: