Opencv学习笔记(三)———特征点匹配

5 篇文章 0 订阅
2 篇文章 0 订阅

在我们提取到带特征点和得到特征描述符后,接下来的工作就是将这些个特征点进行匹配。

一、特征点匹配位于feature2D的模块中所以在使用的时候应该在头文件中加入:

#include<opencv2\features2d\features2d.hpp>

在这个模块中用有三个类:
这里写图片描述

它们的继承关系如下:
这里写图片描述

对于特征点匹配有两种方法:

(1) Brute-force matcher (cv::BFMatcher)
Brute-force matcher就是用暴力方法找到点集一中每个descriptor在点集二中距离最近的 descriptor。这个比较容易理解,这里我们就不具体介绍了。
使用方法:

//BFMatcher 暴力匹配
    vector<DMatch> BFmatches;
    Ptr<DescriptorMatcher> BFMatcher = DescriptorMatcher::create(2);
    //Ptr<BFMatcher> Bmatcher = BFMatcher::create();
    BFMatcher->match(descriptors1, descriptors2, BFmatches);

(2)Flann-based matcher (cv::FlannBasedMatcher)
Flann-based matcher 使用快速近似最近邻搜索算法寻找(用快速的第三方库近似最近邻搜索算法)
使用方法:

//FlannBasedMatcher:
    vector<DMatch> FlannMatches;
    Ptr<FlannBasedMatcher> FlannMatcher = FlannBasedMatcher::create();
    FlannMatcher->match(descriptors1, descriptors2, FlannMatches);

二、两种方法的比较:

两者的区别在于BFMatcher总是尝试所有可能的匹配,从而使得它总能够找到最佳匹配,这也是Brute Force(暴力法)的原始含义。而FlannBasedMatcher中FLANN的含义是Fast Library forApproximate Nearest Neighbors,从字面意思可知它是一种近似法,算法更快但是找到的是最近邻近似匹配,所以当我们需要找到一个相对好的匹配但是不需要最佳匹配的时候往往使用FlannBasedMatcher。当然也可以通过调整FlannBasedMatcher的参数来提高匹配的精度或者提高算法速度,但是相应地算法速度或者算法精度会受到影响。

此外,使用特征提取过程得到的特征描述符(descriptor)数据类型有的是float类型的,比如SurfDescriptorExtractor,
SiftDescriptorExtractor,有的是uchar类型的,比如说有ORB,BriefDescriptorExtractor。对应uchar类型的匹配方式有:BruteForce,BruteForce。所以ORB和BRIEF特征描述子只能使用BruteForce匹配法。

关于匹配的一些处理技巧参见:
http://blog.csdn.net/yangtrees/article/details/19928191?utm_source=tuicool&utm_medium=referral

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值