FLANN 库,包含 KNN 算法。众多工程(例如 OpenCV)使用了 FLANN,这里单独介绍这个库,方便以后单独使用。
由官方 Latex 编译的文档链接,免费的。
ubuntu
下直接通过命令行
sudo apt install libflann1.8 libflann1.8-dev
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;
}
// 构造函数
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)
使用函数 flann::Index::knnSearch
,具体使用方法参考 Example。配置搜索的线程数,精度参考 SearchParameters
参数。
FLANN 还有 RadiusSearch 和 KMeans 算法,参考官方文档即可。