Мне удалось заставить работать VlFeat SIFT, и я хотел бы попробовать сопоставить два набора дескрипторов изображений.Настройка и запрос VlFeat kdtree
векторы признаков просеять являются 128 элементов с плавающей точкой массивы, я хранятся списки дескрипторов в std::vector
с, как показано на рисунке ниже фрагменте кода:
std::vector<std::vector<float> > ldescriptors = leftImage->descriptors;
std::vector<std::vector<float> > rdescriptors = rightImage->descriptors;
/* KDTree, L1 comparison metric, dimension 128, 1 tree, L1 metric */
VlKDForest* forest = vl_kdforest_new(VL_TYPE_FLOAT, 128, 1, VlDistanceL1);
/* Build the tree from the left descriptors */
vl_kdforest_build(forest, ldescriptors.size(), ldescriptors.data());
/* Searcher object */
VlKDForestSearcher* searcher = vl_kdforest_new_searcher(forest);
VlKDForestNeighbor neighbours[2];
/* Query the first ten points for now */
for(int i=0; i < 10; i++){
int nvisited = vl_kdforestsearcher_query(searcher, &neighbours, 2, rdescriptors[i].data());
cout << nvisited << neighbours[0].distance << neighbours[1].distance;
}
Насколько я могу сказать, что должно работать, но все, что я выходите, для расстояний, nan
. Длина проверки дескриптора массива, поэтому, похоже, данные попадают в дерево. Я построил ключевые точки, и они также выглядят разумно, поэтому данные довольно разумные.
Что мне не хватает?
негустой документация здесь (ссылки на API): http://www.vlfeat.org/api/kdtree.html
Хорошо, я думаю, что это была опечатка в вопросе, это на самом деле ошибки, а не предупреждения. Но расстояния все еще равны ~ 1, inf или nan. Я написали набор для перебора грубой силы, чтобы дважды проверить, не потеряны ли данные по пути, и это работает так, как ожидалось. – Josh
Я отредактировал свой ответ с исправлением основной проблемы. – deltheil
Большое спасибо, это имеет смысл - я думал в режиме Python/np.flatten(). Теперь цифры выглядят разумными. – Josh