SURF算法概述

SURF的全称是SpeedUp Features 具有加速版具有鲁棒性的特征算法,SURF最大的特征在于采用了harr特征以及积分图像的概念,大大加快了程序运行的时间,SURF可以用于计算机视觉的物体识别以及3D重构
SURF算法的核心:
1.构建Hessian矩阵构造高斯金字塔尺度空间,每一个像素点都可以求出来一个海森矩阵。
2.利用非极大值抑制初步确定的特征点。
3.精确定位极值点。
4.选取特征点的主方向。
5.构造surf特征点描述算子
在Opencv中关于surf算法部分,常常会涉及SURF,SurfFeatureDetector,SurfDescriptorExtractor这三个类当然这三个类是等价的
SURF类有一个继承的关系,祖先是Algorithm,爷爷是FeatureDetector,DescriptorExtractor,爸爸是features2d,儿子是SURF和SurfFeatureDetector,SurfDescriptorExtractor,三个儿子是一样大的。
在用SURF特征检测中我们可以先进行:绘制关键点的操作 特征点 means 关键点
C++:void drawKeyPoints(const Mat& image,const vector& keypoint,Mat& outImg,const Scalar,int flags=DrawMatchesFlags::DEFAULT);
1.原图像。
2.根据原图像得到的关键点。
3.输出图像,其内容取决于第五个参数标识符flags
4.关键点的颜色。
5.绘制关键点的特征标识符。
KeyPoint类:是一个为特征点检测而生的数据结构,用于表示特征点。
surf特征点的检测:
1.使用FeatureDetector来检测感兴趣的点。
2.使用SurfFeatureDetector以及函数detect来实现检测的过程。
3.使用drawKeypoints函数来绘制检测到的关键点
在Opencv中,使用Surf进行特征点的描述主要是drawMatches和BruteForceMatcher类的运用,
绘制匹配点:drawMatches()函数用于匹配出相匹配的两幅图像的关键点:
C++:void drawMatches(const Mat& img1,constvector& keypoint,const Mat& img2,const vector& keypoint2,const vector& match,Mat& outImg,const Scalar& matchcolor=Scalar::all(-1),const Scalar& singlePointColor=Scalar::all(-1),const vector& matchMask=vector(),int flags=DrawMatchesFlags::DEFAULT)

1.参数1,表示原图像。
2.参数2,根据第一幅图像得到的特征点。
3.参数3,第二幅原图像。
4.参数4,第二幅原图像得到的特征点。
5.参数5,第一幅图像到第二幅图像的匹配点,图一的点在图二中都有一一对应的点。
6.参数6,输出图像。
7.参数7,匹配出的颜色既线和关键点的颜色,默认值表示随机生成的颜色。
8.参数8,单一特征点的颜色,颜色是随机的。
9.参数9,腌膜,确定哪些匹配是会绘制出来的腌膜,如果腌膜为空,表示所有的匹配都会被绘制。
10.参数10,int类型的flags,特征绘制标识符,有默认值的
可以看出C++中的结构体的定义和访问:
定义: struct DrawMatchesFlags{
enum{
DEFAULT=0;
DRAW_OVER_OUTIMG=1;
NOT_DRAW_SINGLE_POINTS=2;
DRAW_RICH_KEYPOINTS=4;
};

                            };
             访问:      DrawMatchesFlag::DEFAULT;
                         以后自己也可以定义结构体进行访问(一会测试)

以上就是绘制匹配的相关操作
但是怎么进行匹配呢?
首先介绍BruteForceMatcher的操作,这个名字就是暴力匹配暴力匹配的祖宗是Algorithm,爷爷是DescriptorMatcher,爸爸是BFMatcher,我是BruteForceMatcher,一层一层的继承的关系
BruteForceMatcher类用到最多的match方法,是从DescriptorMatcher类继承而来的定义:
CV_WRAP void match(const Mat& queryDescriptors,const Mat& trainDescriptors,const Mat& mask=Mat())
SURF特征的提取:首先利用类内的detect函数可以检测出SURF特征的关键点,保存在vector容器中,第二步利用SurfDescriptorExtractor类进行特征向量的相关计算,将之前的vector变量变成矩阵的形式保存在Mat中,最后强行匹配两幅图的特征向量利用BruteForceMatcher中的函数来进行匹配
程序的核心思想:
1.使用SURF接口的关键点以及关键点对应的特征向量
2.使用SurfDescriptorExtractor以及它的函数compute来完成特征的计算。
3.使用BruteForceMatcher来匹配特征向量。
4.使用函数drawMatches来绘制检测到的匹配点
计算描述子或者特征向量:结构为一个Mat矩阵它的行数和特征点向量中元素的个数是一致的,两个特征点越相似他们的特征向量也就是越靠近,这些描述子在特征向量中尤其有用,就是利用描述子进行匹配的第一幅图像中的每一个特征描述子向量都会与第二幅图像中的描述子进行比较,两个向量的距离越近,将会被视为特征的最佳匹配,使用BruteForceMatcher进行匹配:
实例化一个匹配器
BruteForceMatcher<L2> matcher;
vector matches;
matcher.match(descriptors1,descriptors2,matches);
对于已经匹配好的描述子,就可以用drawMatches()函数来进行绘制
drawMatches(srcImg1,keypoint1,srcImg2,keypoint,matches,outImg);显示输出这就是进行暴力匹配的过程

猜你喜欢

转载自blog.csdn.net/nbxuwentao/article/details/86558558