open cvFLANN特征检测

什么是FLANN特征匹配

1.FLANN是快速最近邻搜索包(Fast_Library_for_Approximate_Nearest_Neighbors)的简称 即实现快速高效匹配
FlannBasedMatcher中FLANN的含义是Fast Library forApproximate Nearest Neighbors,从字面意思可知它是一种近似法
算法更快但是找到的是最近邻近似匹配,所以当我们需要找到一个相对好的匹配但是不需要最佳匹配的时候往往使用FlannBasedMatcher
当然也可以通过调整FlannBasedMatcher的参数来提高匹配的精度或者提高算法速度,但是相应地算法速度或者算法精度会受到影响

2.FLANN特征匹配利用近似k近邻算法去寻找一致性,FLANN方法比BF(Brute-Force)方法快的多


FLANN特征匹配的步骤
1.特征匹配记录下目标图像与待匹配图像的特征点(KeyPoint),
2.并根据特征点集合构造特征量(descriptor),对这个特征量进行比较筛选
3.最终得到一个匹配点的映射集合
4.我们也可以根据这个集合的大小来衡量两幅图片的匹配程度


注 :关于目前了解到的图像的各种特征点的关系
corners:包含大量本地信息的像素块,并能够在另一张图中被快速识别
keypoints:作为 corners 的扩展,它将像素块的信息进行编码从而使得更易辨识,至少在原则上唯一
descriptors:它是对 keypoints 进一步处理的结果。通常它具有更低的维度,从而使得图像块能够在另一幅不同的图像中被更快地识别

特征匹配与模板匹配不同,由于是计算特征点集合的相关度,转置操作对匹配影响不大 但它容易受到失真、缩放的影响


FlannBasedMatcher的构造函数如下:

class FlannBasedMatcher : public DescriptorMatcher
{
   	public:
	FlannBasedMatcher(
	const Ptr<flann::IndexParams>& indexParams=new flann::KDTreeIndexParams(),
	const Ptr<flann::SearchParams>& searchParams=new flann::SearchParams() );

	virtual void add( const vector<Mat>& descriptors );
	virtual void clear();

	virtual void train();
	virtual bool isMaskSupported() const;

	virtual Ptr<DescriptorMatcher> clone( bool emptyTrainData=false ) const;
	protected:
};

FLANN特征匹配的原理

1.特征匹配的结果会得到两个特征集合的对应关系列表 第一组特征集被称为训练集(train),第二组被称为查询集(query)
2.Flann 在调用匹配函数之前,为了提高匹配速度,训练一个匹配器。训练阶段是为了优化cv::FlannBasedMatcher的性能
3.train类将会建立特征集的索引树。将 query image 的每一个特征点和 train 匹配器进行匹配,找出最佳匹配
也就是从query image 的特征中逐个去和训练器做匹配,也就是说每一个query image 特征点都会有一个最佳匹配
后期还需要验证这匹配的正确性,可以通过设置截断值来去除误差大的匹配


关于欧式距离和汉明距离
根据描述子的不同,可以选择不同的距离度量。如果是浮点类型的描述子,可以使用其欧式距离;对于二进制的描述子(BRIEF)可以使用其汉明距离(两个不同二进制之间的汉明距离指的是两个二进制串不同位的个数)

关于匹配方法
交叉匹配
针对暴力匹配,可以使用交叉匹配的方法来过滤错误的匹配 交叉过滤的思想很简单,再进行一次匹配,反过来使用被匹配到的点进行匹配,
如果匹配到的仍然是第一次匹配的点的话,就认为这是一个正确的匹配。举例来说就是,假如第一次特征点A使用暴力匹配的方法,
匹配到的特征点是特征点B;反过来,使用特征点B进行匹配,如果匹配到的仍然是特征点A,则就认为这是一个正确的匹配,
否则就是一个错误的匹配。OpenCV中BFMatcher已经封装了该方法,创建BFMatcher的实例时,第二个参数传入true即可,
BFMatcher bfMatcher(NORM_HAMMING,true)

KNN匹配
K近邻匹配,在匹配的时候选择K个和特征点最相似的点,如果这K个点之间的区别足够大,则选择最相似的那个点作为匹配点
通常选择K = 2,也就是最近邻匹配。对每个匹配返回两个最近邻的匹配,如果第一匹配和第二匹配距离比率足够大(向量距离足够远),
则认为这是一个正确的匹配,比率的阈值通常在2左右

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui_c.h>
#include <opencv2/xfeatures2d.hpp>
#include <iostream>
#include <math.h>

using namespace cv;
using namespace std;
using namespace cv::xfeatures2d;

Mat src, src2,dst;
void FLANNdetector(<
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值