0

我已经设法让 VlFeat 的 SIFT 实现工作,我想尝试匹配两组图像描述符。

SIFT 的特征向量是 128 个元素的浮点数组,我将描述符列表存储在std::vectors 中,如下面的片段所示:

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

4

1 回答 1

1

我错过了什么?

的第二个参数vl_kdforestsearcher_query需要一个指向VlKDForestNeighbor:

vl_size
vl_kdforestsearcher_query(
  VlKDForestSearcher *self,
  VlKDForestNeighbor *neighbors,
  vl_size numNeighbors,
  void const *query
);

但是在这里您声明VlKDForestNeighbor neighbours[2];然后&neighbours作为不正确的第二个参数传递 - 您的编译器可能发出incompatible pointer types警告。

由于您声明了一个数组,因此您必须做的是显式传递一个指向第一个邻居的指针:

int nvisited = vl_kdforestsearcher_query(searcher, &neighbours[0], 2, qrys[i]);

或者让编译器为你做这件事:

int nvisited = vl_kdforestsearcher_query(searcher, neighbours, 2, qrys[i]);

编辑

确实有第二个(主要)问题与您使用ldescriptors.data().

std::vector<float>*当 VLFeat 需要一个float *包含所有数据点的连续数组时,您在此处传递一个指针,该数组按行主要顺序排列。所以你可以做的是以这种格式复制你的数据:

float *data = new float[128*ldescriptors.size()];

for (unsigned int i = 0; i < ldescriptors.size(); i++)
  std::copy(ldescriptors[i].begin(), ldescriptors[i].end(), data + 128*i);

vl_kdforest_build(forest, ldescriptors.size(), data);

// ...

// then, right after `vl_kdforest_delete(forest);`
// do a `delete[] data;`
于 2015-02-21T18:12:44.017 回答