2013-07-07 172 views
0

我有13万SIFT描述。我正在使用Opencv的flann模块构建分层Kmeans索引。这个我想这些量化描述130000后(会更晚一些量化)。我正在使用flann的knnsearch方法来做到这一点。但这种方法的结果是奇怪的。对于每个描述符,它显示的最近索引是描述符本身的索引。然而,应当显示这将是海康树的叶子的一个最近的簇的簇ID。OpenCV的FLANN模块:KNN-搜索层次k均值树给人怪异的结果

我应该尝试K = 2

下面的代码片段 - (!它不给集群-ID)

int k=1; 
cv::flann::KMeansIndexParams indexParams(8,4,cvflann::FLANN_CENTERS_KMEANSPP) ; 
cv::flann::Index hik_tree(cluster_data, indexParams); 
Mat indices,dist; 
hik_tree.knnSearch(cluster_data, indices, dist, k, cv::flann::SearchParams(64)); 

回答

2

knnSearch正在寻找在指数k最近邻居。你建立一个使用cluster_data索引,然后尝试匹配cluster_data对本身。在这种情况下,这并不奇怪的是,最近的邻居给每个描述符本身就是...

编辑:如果你想要得到的中心,看看这个(从FLANN库的源) :

/** 
* Chooses the initial centers using the algorithm proposed in the KMeans++ paper: 
* Arthur, David; Vassilvitskii, Sergei - k-means++: The Advantages of Careful Seeding 
*/ 
template <typename Distance> 
class KMeansppCenterChooser : public CenterChooser<Distance> 
{ 
... 
+0

那么我怎样才能得到最接近的cluster.Is径向搜索方法应该做它我想要去的索引的叶子 – code4fun

0

K-NN是一种监督分类算法,这就是为什么你应该建立与训练样本的Index对象,所以使用

CV :: FLANN ::指数hik_tree(样本,indexParams);的

代替

CV :: FLANN ::索引hik_tree(cluster_data,indexParams);