2013-07-07 1 views
0

У меня около 130 000 дескрипторов SIFT. Я создаю иерархический индекс Kmeans, используя модуль Flann Opencv. После этого я хочу квантовать эти 130 000 дескрипторов (будет квантовать более позднее). Для этого я использую метод knnsearch flann. Но результат этого метода - нечто странное. Для каждого дескриптора ближайший индекс, который он показывает, является индексом самого дескриптора. Однако он должен отображать идентификатор кластера ближайшего кластера, который будет одним из листов дерева HIK.opencv flann module: knn-search для иерархического дерева kmeans, дающий странный результат

Если я пытаюсь к = 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 ищет К-ближайших соседей по индексу , Вы создаете свой индекс, используя cluster_data, а затем пытаетесь сопоставить cluster_data с самим собой. В этой ситуации, это не удивительно, что ближайший сосед каждого дескриптор сам ...

EDIT: Если вы хотите получить центры, посмотри на это (от источника библиотеки 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 метод радиопоиска должен сделать it.i хотите идти до листа индекса – code4fun

0

к-НН является алгоритм Контролируемой классификации, поэтому вы должны построить Index объект с вашими образцами обучения, так что используйте

резюме :: Flann :: Индекс hik_tree (образцы , indexParams);

вместо

сорта :: Flann :: Индекс hik_tree (cluster_data, indexParams);

Смежные вопросы