VlFeature kdtree设置和查询
VlFeat kdtree setup and query
我已经设法让VlFeat的SIFT实现正常工作,我想尝试匹配两组图像描述符。
SIFT的特征向量是128个元素的浮点数组,我将描述符列表存储在std::vector
s中,如下所示:
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
我错过了什么?
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()
构建kd树的方式有关。
在这里,当VLFeat期望float *
连续数组按行主顺序包含所有数据点时,您将传递一个std::vector<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;`
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- Mongodb c++驱动程序:如何查询元素的数组
- 在C++/Linux中设置单调时钟的一些技巧
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 查询SQLite数据库中的日期
- 嵌套在类中时无法设置成员数据
- 需要帮助设置在C++中使用的Potrace
- 如何在自删除后将对象设置为nullptr
- 将指针设置为"nullptr"并不能防止双重删除?
- 如何在Ubuntu中使用cmake设置qt4
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 如何在boost beast http请求中设置http头
- MySQL c++ 连接器:使用 SetBlob() 在查询中设置多个 blob 数据的正确方法是什么?
- 使用STL设置功能查询
- 是否可以在C 中以编程方式查询不同的DNS名称服务器,从而忽略系统设置
- 如何在 c++ 中设置 ODBC 连接以执行多个查询 (SQLExecDirect)
- 重新设置了以前的状态3查询
- VlFeature kdtree设置和查询
- 如何查询范围中的任何位是否在 C++ std::bitset 中设置
- 在 c++ 中设置格式 SQL 查询