opencv flann模块:knn搜索给出奇怪结果的分层kmeans树

opencv flann模块:knn搜索给出奇怪结果的分层kmeans树,opencv,sift,knn,flann,Opencv,Sift,Knn,Flann,我有大约130000个SIFT描述符。我正在使用Opencv的flann模块构建一个层次化的Kmeans索引。在此之后,我想量化这130000个描述符(稍后将进一步量化)。我正在使用flann的knnsearch方法来做这件事。但这种方法的结果有些奇怪。对于每个描述符,它显示的最近的索引是描述符本身的索引。但是,它应该显示最近集群的集群ID,该集群将是HIK树的叶子之一 我应该试试k=2吗 下面是一段代码片段- int k=1; cv::flann::KMeansIndexParams in

我有大约130000个SIFT描述符。我正在使用Opencv的flann模块构建一个层次化的Kmeans索引。在此之后,我想量化这130000个描述符(稍后将进一步量化)。我正在使用flann的knnsearch方法来做这件事。但这种方法的结果有些奇怪。对于每个描述符,它显示的最近的索引是描述符本身的索引。但是,它应该显示最近集群的集群ID,该集群将是HIK树的叶子之一

我应该试试k=2吗

下面是一段代码片段-

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

knnSearch
正在索引中查找k个最近邻(它不提供集群ID!)。您使用
cluster\u数据
构建索引,然后尝试将
cluster\u数据
与自身进行匹配。在这种情况下,毫不奇怪,每个描述符的最近邻居是它自己

编辑:如果要获取中心,请查看以下内容(从FLANN库的源代码):

/**
*使用KMeans++论文中提出的算法选择初始中心:
*亚瑟,大卫;Vassilvitskii,Sergei-k-means++:小心播种的优势
*/
模板
类KMeanspCenterChooser:公共中心选择器
{
...

k-NN是一种监督分类算法,这就是为什么要用训练样本构造一个
索引
对象,所以使用

cv::flann::索引hik_树(样本、索引参数)

而不是

cv::flann::索引hik_树(集群数据,索引参数)


那我怎么才能得到最近的聚类呢?是radiussearch方法吗?我想一直到索引的叶子
/**
 * 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>
{
...