FLANN库介绍及其应用

【计算机视觉】OpenCV的最近邻开源库FLANN FLANN介绍FLANN库全称是Fast Library for Approximate Nearest Neighbors,它是目前最完整的(近似)最近邻开源库。不但实现了一系列查找算法,还包含了一种自动选取最快算法的机制。flann::Index_类该类模板是最近邻索引类,该类用于抽象不同类型的最近邻搜索的索引。 以下是flann::Index_类的声明:template <typename 阅读详情

原文转自:https://blog.youkuaiyun.com/App_12062011/article/details/51987352

-----------------------------------------------分割线---------------------------------------------

一、简介

我们可以用下面的方式定义最近邻搜索(NNS)问题:在一个度量空间X给定一组点P=p1,p2,…,pn,这些点必须通过以下方式进行预处理,给第一个新的查询点q属于X,快速在P中找到距离q最近的点,即最近邻搜索问题。

 

最近邻搜索的问题是在很多应用领域是一个重大问题,如图像识别、数据压缩、模式识别和分类、机器学习、文档检索系统、统计和数据分析等。然而,在高维空间中解决这个问题似乎是一个非常难以执行任务,没有算法明显优于标准的蛮力搜索。因此越来越多的人把兴趣点转向执行近似最近邻搜索的一类算法,这些方法在很多实际应用和大多数案例中被证明是足够好的近似,比精确搜索算法快很大的数量级。

 

FLANN(Fast Library for Approximate Nearest Neighbors)是一个执行快速近似最近邻搜索的库。FLANN使用C++写成。他能够很容易地通过C,MTALAB和Python等绑定提供的库,用在很多环境中。

 

二、使用FLANN

FLANN库的核心部分使用C++写成。为了最大性能和灵活性的使用模版代码,应该尽量使用C++绑定(C++ bindings)。你只要包含库的头文件flann.hpp就能使用C++bindings。

 

下面我们介绍几个公共C++ API。

 

1.flann::Index

这是FLANN最近邻指数类。该类用于抽象的不同类型的最近邻搜索索引。距离函子的类模板用于计算两个特征空间之间的距离。

namespace flann

{

template<typename Distance>

class Index

{

typedef typename Distance::ElementType ElementType;

typedef typename Distance::ResultType DistanceType;

public:

Index(const IndexParams& params, Distance distance = Distance() );

Index(const Matrix<ElementType>& points, const IndexParams& params,

Distance distance = Distance() );

~Index();

void buildIndex();

void buildIndex(const Matrix<ElementType>& points);

void addPoints(const Matrix<ElementType>& points,

float rebuild_threshold = 2);

void removePoint(size_t point_id);

ElementType* getPoint(size_t point_id);

int knnSearch(const Matrix<ElementType>& queries,

Matrix<int>& indices,

Matrix<DistanceType>& dists,

size_t knn,

const SearchParams& params);

int knnSearch(const Matrix<ElementType>& queries,

std::vector< std::vector<int> >& indices,

std::vector<std::vector<DistanceType> >& dists,

size_t knn,

const SearchParams& params);

int radiusSearch(const Matrix<ElementType>& queries,

Matrix<int>& indices,

Matrix<DistanceType>& dists,

float radius,

const SearchParams& params);

int radiusSearch(const Matrix<ElementType>& queries,

std::vector< std::vector<int> >& indices,

std::vector<std::vector<DistanceType> >& dists,

float radius,

const SearchParams& params);

void save(std::string filename);

int veclen() const;

int size() const;

IndexParams getParameters() const;

flann_algorithm_t getType() const;

}; }

 

其他API,大家可以通过FLANN手册查找,下载 http://download.youkuaiyun.com/detail/eric41050808/9133803 。此次仅介绍knnSearch方法:

 

2.flann::Index::knnSearch

对一组点查询点,该方法执行K最近邻搜索。该方法有两个实现,一个携带预开辟空间的flann::Matrix对象接收返回的找到邻居的索引号和到其距离;另一个是携带std::vector<std::vector>根据需要自动重新调整大小。

 

 
int Index::knnSearch(const Matrix<ElementType>& queries,

Matrix<int>& indices,

Matrix<DistanceType>& dists,

size_t knn,

const SearchParams& params);

int Index::knnSearch(const Matrix<ElementType>& queries,

std::vector< std::vector<int> >& indices,

std::vector<std::vector<DistanceType> >& dists,

size_t knn,

const SearchParams& params);

 

参数:

queries: 承载查询点的矩阵,矩阵大小是:查询点数*纬数;

indices: 将承载所有被找到的K最近邻的索引号( 预开辟的大小应该至少是查询点数*knn);

dists:     将承载到所有被找到的K最近邻的距离只(预开辟大小应该至少是查询点数*knn);

knn:       要找的最近邻的个数;

params: 搜索参数。承载搜索时要使用的参数的结构体,结构体类型是SearchParameters。

SearchParameters

struct SearchParams

{

SearchParams(int checks = 32,

float eps = 0,

bool sorted = true);

int checks;

float eps;

bool sorted;

int max_neighbors;

tri_type use_heap;

int cores;

bool matrices_in_gpu_ram;

};


 

其中,checks: 当搜索邻居时用来制定叶子数的最大值。其值越大,搜索精度越高,但是也会消耗更多时间。如果要检索所有叶子,使用宏值CHECKS UNLIMITED。如果在对象index创建时使用自动配置,达到指定精度的需要的检索次数也会被计算出来,这是使用宏值CHECKS_AUTOTUNED。

【算法】FLANN中kd树构建和查询的简明分析 K-最近邻(K-Nearest Neighbour, KNN)算法是一种基本分类与回归方法,属于监督学习方法,其工作机制非常简单:给定测试样本,基于某种距离度量找出训练集中与其最靠近的k个训练样本。算法的输入输出如下:输入:输出:在特征匹配的应用中,我们通常找到最接近2个最近邻点(k=2),并在这两个关键点中,若最近的距离除以次近的距离小于指定阈值ratio,则接受这一对匹配点。Low推荐ratio的取值为0.8,但Low对大量存在尺度、旋转和亮度变化的两幅图片进行匹配,实验结果表明ratio取值在0. 4 阅读详情

相关推荐

opencv学习笔记三十三:FLANN匹配

FLANN库全称是Fast Library for Approximate Nearest Neighbors,它是目前最完整的(近似)最近邻开源库。不但实现了一系列查找算法,还包含了一种自动选取最快算法的机制。 OpenCV提供了 两种Matching方式 :  BFMatcher FlannBasedMatcher BF(Brute Force)就是用暴力方法找到点集一中每个descript...

qq_24946843的博客 2391

FLANN匹配算法

目录 0 简介 一 算法的选择 1、 随机k-d树算法(The Randomized k-d TreeAlgorithm) a. Classick-d tree b. Randomizedk-d tree 2、 优先搜索k-means树算法(The Priority Search K-MeansTree Algorithm) 2.1 算法描述 3 、层次聚类树 (The Hierarchical ClusteringTree) 二 遍历次数 0 简介 FLANN是快速最近邻搜索包...

建建的博客 7869

OPENCV实现FLANN特征匹配

【代码】OPENCV实现FLANN特征匹配。

weixin_44119674的博客 285

ML之SIFT_FLANN:FLANN算法的简介、使用方法(对图片提取SIFT特征并利用FLANN方法实现计算图像相似度并可视化案例)之详细攻略

ML之SIFT_FLANN:FLANN算法的简介、使用方法(对图片提取SIFT特征并利用FLANN方法实现计算图像相似度并可视化案例)之详细攻略。

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 1万+

FLANN库的近邻搜索技术应用实战

在现代数据处理中,尤其是在机器学习和计算机视觉领域,高效的高维数据近邻搜索变得至关重要。高维近邻搜索库(Fast Library for Approximate Nearest Neighbors, FLANN)是由OpenCV团队开发的一个库,旨在解决高维空间中近邻搜索的性能问题。FLANN提供了一系列近邻搜索算法,以及一个灵活的接口来自动选择最佳算法来适应数据的特点,从而实现快速搜索。它不仅适用于图像处理,也广泛用于语音识别、推荐系统和其他需要大量数据处理的应用中。

weixin_36311421的博客 1217

flann库下载(可直接用)

flann库下载(可直接用)

KNN(四)--FLANN库介绍及其应用

FLANN介绍 FLANN库全称是Fast Library for Approximate Nearest Neighbors,它是目前最完整的(近似)最近邻开源库。不但实现了一系列查找算法,还包含了一种自动选取最快算法的机制。 flann::Index_类 该类模板是最近邻索引类,该类用于抽象不同类型的最近邻搜索的索引。 以下是flann::Index_类的声明: templ

工作笔记 1万+

DPARSF高级版 vs 基础版怎么选?没有T1数据也能做fMRI分析吗?

本文深度对比了DPARSF高级版与基础版在fMRI分析中的核心差异与适用场景,特别针对无T1数据的情况提供了实战解决方案。高级版依赖T1像实现高精度配准,适合需要精确解剖定位的研究;基础版则无需T1数据,适用于功能连接等相对空间要求不高的分析。文章还提供了版本选择决策树和常见问题解决方案,帮助研究者根据实际需求做出最优选择。

weixin_42526087的博客 132

PCL中使用FLANN库(1)

FLANN库全称是Fast Library for Approximate Nearest Neighbors,它是目前最完整的(近似)最近邻开源库。不但实现了一系列查找算法,还包含了一种自动选取最快算法的机制,在一个度量空间X给定一组点P=p1,p2,…,pn,这些点必须通过以下方式进行预处理,给第一个新的查询点q属于X,快速在P中找到距离q最近的点,...

weixin_34419321的博客 471

超级详细!!!新手使用AutoDL跑深度学习(MixVPR项目)的学习记录

新手第一次在AutoDL上跑深度学习的实验,遇到一些问题,简单记录一下。如果大家发现问题,欢迎和我讨论。

weixin_45152283的博客 5万+

手把手复现论文:SVPWM过调制I区与II区算法仿真(附MATLAB源码)

本文详细介绍了SVPWM过调制I区与II区算法的MATLAB仿真实现,从理论推导到Simulink建模逐步解析。通过源码示例展示幅值补偿和六边形跟踪等关键技术,帮助电力电子研究者掌握过调制算法的核心实现方法,适用于电机控制、变频器等工业应用场景。

weixin_28739079的博客 530

k近邻法(k-NN)笔记3-第三方库FLANN介绍-下载/编译/测试代码解析

k近邻法(k-NN)笔记3- 第三方实现(PCL点云库kdtree模块)笔者我查阅了较多kdtree的第三方实现,下载调试了github上及其他途径的代码,结合个人喜好和对比结果,推荐PCL点云库kdtree模块。PCL库是大型跨平台开源C++编程库,实现了大量点云相关的通用算法和高效数据结构,其中划分了许多模块,其中有一个核心问题就是建立离散点间的拓扑关系,实现基于邻域关系的快速查找。 具体详情...

tiankong_的博客 6309

Android 13.0仿ios的hotseat效果修改hotseat样式

在13.0系统产品rom定制化开发中,在项目需求的需要,系统原生Launcher的布局样式很一般,所以需要重新设计ui对布局样式做调整,产品在看到 ios的hotseat效果觉得特别美观,所以要仿ios一样不需要横屏铺满的效果 居中显示就行了,所以就要看hotseat的具体布局显示了

安卓兼职framework和app工程师的博客 1144

《PCL点云库学习&VS2010(X64)》Part 37 FLANN——快速最近邻搜索库

《PCL点云库学习&VS2010(X64)》Part 37 FLANN——快速最近邻搜索库 一、介绍         该算法库在OpenCV和PCL等开源库中应用较广,是PCL的默认安装库之一。与PCL自带的Kdtree比较,暂时没做比较,但是将其专门作为一个库,说明其功能的强大及其实用性好。 包含6个函数: 1、Index 2、buildIndex 3、addPoints

梁的博客 2297

华为OD机试2025C卷-双十一最大花费金额[100分](Java_Python3_C++_C语言_JsNode_Go)实现100%通过率

双十一最大花费金额 - 动态规划解法 摘要:本文介绍了华为OD机试中"双十一最大花费金额"问题的动态规划解法。该问题要求在给定N件商品价格和优惠券面额X的情况下,选择若干商品使总花费不超过X且尽可能大。核心解法采用布尔型动态规划数组,记录每个金额是否可被拼出。算法时间复杂度为O(N*X),空间复杂度为O(X)。通过倒序遍历避免重复选择同一商品,最后从X向下查找第一个可达金额作为答案。文中提供了C++和Java的实现代码,并解释了与经典0-1背包问题的关系。 关键点: 问题本质是0-1背包/子集和问题的变体

2503_91057718的博客 47

【x265编码器】章节6——x265的码率控制

对于CRF模式而言,右边这部分是是固定值m_rateFactorConstant,在初始化的时候确定,跟分辨率,qCompress这个参数是外部可设参数,默认值0.6,因此QP的选择只跟编码复杂度有关,跟码率无关,编码复杂度越高,QP值越高,因此可以一定程度上说CRF模式是恒定质量的编码模式。其中Complex表示当前帧的编码复杂度,x265中用lookahead模块计算的SATD作为衡量当前帧的复杂度,c为模型参数,qscale是率失真优化中的拉格朗日乘子,R为编码当前帧需要的比特数。

vcvdv123的博客 1万+

OpenCV的最近邻开源库FLANN

标签:计算机视觉 FLANN介绍 FLANN库全称是Fast Library for Approximate Nearest Neighbors,它是目前最完整的(近似)最近邻开源库。不但实现了一系列查找算法,还包含了一种自动选取最快算法的机制。 flann::Index_类 该类模板是最近邻索引类,该类用于抽象不同类型的最近邻搜索的索引。  以下是flann::Index_类的声明

FireMicrocosm的专栏 1640

YOLOv12涨点优化:自研检测头 | 独家创新(Partial_C_v12Detect)检测头结构创新,实现涨点

现有12Detect进行二次创新,提升检测精度,独家创新(Partial_C_12Detect)检测头结构创新,适合科研创新度十足,强烈推荐

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 633

FLANN_Based SURF特征匹配

官网教程 介绍 FLANN(Fast Library for Approximate Nearest Neighbors)在一个描述符集合(询问集)中找另一个集合(相当于训练集)的最近邻。 例子 #include <iostream> #include <vector> #include <opencv2/xfeatures2d.hpp> #includ...

zzyczzyc的博客 420

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

实践:使用FLANN.LSH进行检索

OpenCV的FLANN库相对于原始FLANN库功能较少;比如不能直接使用flann::Matrix   data ();

wishchinYang的专栏 4499

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

近似最近邻搜索方法FLANN简介

AR/VR群:244751474 ,欢迎加入,进行项目讨论! -----------------------------------------------分割线--------------------------------------------- 一、简介 我们可以用下面的方式定义最近邻搜索(NNS)问题:在一个度量空间X给定一组点P=p1,p2,…,pn,这些点必须通过以下方

噌胥苑——行思驿站 2万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

20160907-Flann

layout title categories tags date description post 近邻查询近似算法库FLANN blog tools 2016-09-07 02:25:24 -0700 近似近邻查询,作为大数据搜索方面的算法层...

DeepIndeed 495
上一篇: 贪婪算法的分析与实现
下一篇: 高斯滤波在图像处理中的应用
LiBin1103
博客等级 码龄9年 38粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值