2013-07-27 23 views
0

我试图实现Scalable Recognition with a Vocabulary Tree ,我使用opencv kmeans函数来聚类特征向量,所以我把我的所有向量放在一个Mat对象中,并将它传递给像这样的函数:opencv kmeans不分类数据在某些类

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 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

事实证明,有些时候一些集群中有少于K个的成员,所以在下一个层次中该函数返回一个错误。尽管我仍然没有弄清楚为什么有时候一个集群是空的。