当前位置: 首页 > 工具软件 > FLANN > 使用案例 >

FLANN C++ 使用

艾文斌
2023-12-01

FLANN

FLANN 库,包含 KNN 算法。众多工程(例如 OpenCV)使用了 FLANN,这里单独介绍这个库,方便以后单独使用。

由官方 Latex 编译的文档链接,免费的。

安装

ubuntu 下直接通过命令行

sudo apt install libflann1.8 libflann1.8-dev

HDF5

FLANN 库例程使用了 HDF5 库,但是引用有些问题。编译时,头文件路径需要包含 /usr/include/hdf5/serial/。需要链接库 hdf5_serial_hlhdf5_serial

使用

数据类型

基本的数据类型是Matrix。参考其构造函数,只需要传入连续的数据块并指定类型,行,列即可。传入 OpenCV 或者 Eigen 中的矩阵的指针。

Matrix(T* data_, size_t rows_, size_t cols_, size_t stride_ = 0) :
    	Matrix_(data_, rows_, cols_, flann_datatype_value<T>::value, stride_)
    {
    	if (stride==0) stride = sizeof(T)*cols;
    }

FLANN::Index

// 构造函数
Index(const Matrix<ElementType>& features, const IndexParams& params, Distance distance = Distance() )

// Example
Index<L2<float> > index(dataset, flann::KDTreeIndexParams(4));

L2<float> 指定距离函数和类型。构建时传入数据集和参数。关于 Distance 和 Parameter 请参考官方文档。

features 维度是 (N, C),且是 RowMajor

ElementType* getPoint(size_t point_id) 方法根据 point_id 返回指向数据点的指针。point_id 按照dataset添加的顺序确定。

index.getPoint(0) // 指向(0, 0)
index.getPoint(0)+1 // 指向(0, 1)
index.getPoint(1) // 指向(1, 0)

KNN

使用函数 flann::Index::knnSearch,具体使用方法参考 Example。配置搜索的线程数,精度参考 SearchParameters 参数。

FLANN 还有 RadiusSearch 和 KMeans 算法,参考官方文档即可。

 类似资料: