一、编译HDF5
1、下载源码:https://github.com/pengzerong/HDF5
2、解压并编译
解压下载到的:CMake-hdf5-1.12.0.zip。注意:路径中不要有空格
运行build-VS2017-64.bat,等待编译完成。
二、编译FLANN
1、下载源码:https://github.com/pengzerong/FLANN
2、解压
(我的解压路径为G:\flann-1.8.4)
在该文件夹下创建Build文件夹作为编译的文件夹,flann-res作为临时安装的文件夹,flann-debug作为Debug版本的安装目录,flann-release作为Release版本的安装目录
3、打开CMake-gui,将flann-1.8.4-src文件夹中的CMakeLists.txt拖至CMake中,设置创建路径,可以勾选Grouped和Advanced选项
点击Configure
将CMAKE中的CMAKE_INSTALL_PREFIX修改为我们创建的flann-res目录,此为临时安装的目录
接着点击Add Entry,添加Name:CMAKE_DEBUG_POSTFIX,Type为STRING,Value为d,Description可为空。这样可以让debug版本编译出二进制文件,带有后缀d.以便和release版本编译出的二进制文件相区分,建议这么做。
添加之后,点击Configure。若没有红色配置出现,可点击Generate
4、打开Build文件夹下的flann.sln,进行64位下Debug版本的生成。
在Debug状态下,右键ALL_BUILD生成。生成成功后右键INSTALL-仅用于项目-仅生成INSTALL,完成debug的安装
5.此时在flann-res目录下生成以下文件,将它们剪切至flann-debug文件夹下完成安装(Release版安装过程一直,不赘述)
三、调用FLANN
https://github.com/pengzerong/flann-test
1、新建解决方案flann-test,将以下代码拷贝过去
#include <iostream> #include <flann/flann.hpp> #include <flann/io/hdf5.h> #include <stdio.h> using namespace flann; int main(int argc, char** argv) { int nn = 3; Matrix<float> dataset; Matrix<float> query; load_from_file(dataset, "dataset.hdf5", "dataset"); load_from_file(query, "dataset.hdf5", "query"); Matrix<int> indices(new int[query.rows*nn], query.rows, nn); Matrix<float> dists(new float[query.rows*nn], query.rows, nn); // construct an randomized kd-tree index using 4 kd-trees Index<L2<float> > index(dataset, flann::KDTreeIndexParams(4)); index.buildIndex(); // do a knn search, using 128 checks index.knnSearch(query, indices, dists, nn, flann::SearchParams(128)); for (int i = indices.rows; i < indices.rows; i++) { for (int j = 0; j < indices.cols; j++) { std::cout << indices[i][j] << " "; } std::cout << std::endl; } std::cout << "index size: " << index.size() << std::endl; std::cout << std::endl; flann::save_to_file(indices, "result.hdf5", "result"); delete[] dataset.ptr(); delete[] query.ptr(); delete[] indices.ptr(); delete[] dists.ptr(); return 0; }
2、配置项目
属性-->VC++目录-->包含目录
属性-->VC++目录-->库目录
属性-->链接器-->输入-->附加依赖项
3、下载调试数据文件dataset.hdf5
https://github.com/pengzerong/flann-test/blob/master/dataset.hdf5
4、可能遇到的问题
1) 编译时报pop_t问题的解决
2) x64环境下编译flann源代码编译错误 .serialize 左边必须有类/结构/联合
flann在x86环境下能很好的编译通过,但是在x64环境下面就会出现这个问题,这是源代码本身的问题
解决办法在serialzation.h的96行代码后面增加如下代码:
#ifdef _MSC_VER
BASIC_TYPE_SERIALIZER(unsigned __int64);
#endif
5、若执行成功,会生成result.hdf5文件,表示编译并执行成功