FLANN C++ 使用

  • Post author:
  • Post category:其他




FLANN

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

由官方 Latex 编译的文档

链接

,免费的。



安装


ubuntu

下直接通过命令行

sudo apt install libflann1.8 libflann1.8-dev



HDF5

FLANN 库例程使用了 HDF5 库,但是引用有些问题。编译时,头文件路径需要包含

/usr/include/hdf5/serial/

。需要链接库

hdf5_serial_hl



hdf5_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 算法,参考官方文档即可。



版权声明:本文为lib0000原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。