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