opencv之SURF特征点提取及匹配

1.概述

在基于特征匹配的方法中,Surf算法对物体的旋转、光照等情况有较好的鲁棒性,且教SIFT算法而言计算速度更快。通过Surf算法检测到的特征点其描述符包含了这个点的位置和尺度信息,故对两幅图片进行匹配时可以通过两幅图中特征点匹配对进行匹配。即使物体位置和光照的改变也能够有良好的匹配效果。
在本片文章中将使用SurfDescriptorExtractor及其函数compute来完成特定计算,使用BruteForceMatcher匹配得到的特征向量,使用函数drawMatches来绘制检测到的匹配点。

2.OpenCV API

2.1 SurfDescriptorExtractor

Surf用来封装的用于计算特征描述子的类,其定义如下

typedef SURF cv::xfeatures2d::SurfDescriptorExtractor

是SURF的一个重定义,也是类xfeatures2d的一个成员函数,其类定义如下:
class SurfDescriptorExtractor : public DescriptorExtractor
{
public:
SurfDescriptorExtractor( int nOctaves=4,
int nOctaveLayers=2, bool extended=false );

    virtual void read (const FileNode &fn);
    virtual void write (FileStorage &fs) const;
    virtual int descriptorSize() const;
    virtual int descriptorType() const;
protected:
    ...
}

我们可以看出SurfDescriptorExtractor是从DescriptorExtractor公有继承而来。

2.2BruteForceMatcher

暴力搜索特征点匹配。对于第一集合中的特征描述子,这个匹配寻找在第二个集合中最相近的特征描述子,这种特征描述子匹配支持masking permissible特征描述子集合匹配,其定义如下:

template<class Distance>
class BruteForceMatcher : public DescriptorMatcher
{
public:
    BruteForceMatcher( Distance d = Distance() );
    virtual ~BruteForceMatcher();

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

从DescriptorMatcher公有继承,同时又有本身的虚成员函数。

2.3 drawMatches

给定两幅图像,绘制寻找到的特征关键点及其匹配。有两种定义形式如下:

void cv::drawMatches    (   InputArray  img1,
                            const std::vector< KeyPoint > &     keypoints1,
                            InputArray  img2,
                            const std::vector< KeyPoint > &     keypoints2,
                            const std::vector< DMatch > &   matches1to2,
                            InputOutputArray    outImg,
                            const Scalar &  matchColor = Scalar::all(-1),
                            const Scalar &  singlePointColor = Scalar::all(-1),
                            const std::vector< char > &     matchesMask = std::vector< char >(), 
                            int     flags = DrawMatchesFlags::DEFAULT 
                        )

void cv::drawMatches    (   InputArray  img1,
                            const std::vector< K
  • 11
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值