《opencv学习笔记》-- SURF 特征提取

SURF算法为每个检测到的特征定义了位置和尺度,尺度值可用于定义围绕特征点的窗口大小。不论物体的尺度在窗口是什么样的,都将包含相同的视觉信息,这些信息用于表示特征点以使得它们与众不同。
在特征匹配中,特征描述子通常用于N维向量,在光照不变以及少许透视变形的情况下很理想。另外,优质的描述子可以通过简单的距离测量进行比较,比如欧氏距离。
使用 SURF 进行特征点描述主要是 drawMatches 方法和 Br u teFor ceMatcher类
opencv \ sources \ modules \ legacy \ include \ opencv2 \ legacy\legacy.h pp路径下
绘制匹配点: drawMatches()函数     绘制相匹配的两个图像的关键点
 
void drawMatches(const Mat& img1, const vector<KeyPoint>& keypoints1,
                 const Mat& img2, const vector<KeyPoint>& keypoints2,
                 const vector<DMatch>& matches1to2, Mat& outImg,
                 const Scalar& matchColor = Scalar::all(-1),
                 const Scalar& singlePointColor = Scalar::all(-1),
                 const vector<char>& matchesMask = vector<char>(),
                 int flags = DrawMatchesFlags::DEFAULT)

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

参数1,const Mat&类型的 img1,第一幅源图像。

参数2,const vector<KeyPoint>&类型的keypoints1,根据第一幅源图像得到的特征点。

参数3,const Mat&类型的img2,第二幅源图像。

参数4,const vector<KeyPoint>&类型的keypoints2,根据第二幅源图像得到的特征点。

参数5,matches1to2,第一幅图像到第二幅图像的匹配点,即表示每一个图1中的特征点都

             在图2中有一 一对应的点。

参数6,Mat&类型的 outImg,输出图像,其内容取决于第五个参数标识符falgs。

参数7,const Scalar&类型的matchColor,匹配的输出颜色,即线和关键点的颜色。

             有默认值 Scalar::all(-1),表示颜色是随机生成的。

参数8,const Scalar&类型的singlePointColor,单一特征点的颜色,表示随机生成颜色的

             默认值 Scalar:.all(-1)。

参数9,matchesMask,确定哪些匹配是会绘制出来的掩膜,如果掩膜为空,表示所有匹配

             都进行绘制。

参数10,int类型的flags ,特征绘制的标识符,有默认值DrawMatchesFlags::DEFAULT。

枚举描述

DEFAULT

0

创建输出图像矩阵(使用Mat : :create)。使用现存的输出图像绘制匹配对和特征点。且对每一个关键点,只绘制中间点

DRAW_OVER_OUTIMG

1

不创建输出图像矩阵,而是在输出图像上绘制匹配对

NOT_DRAW_SINGLE_POINTS

2

单个特征点不被绘制

DRAW_RICH_KEYPOINTS

3

对每一个关键点,绘制带大小和方向的关键点圆圈

BruteForceMatcher类 :

        继承BFMatcher 类(opencv sources\modules\features2d\include\opencv2\features2d\

                                features2d.hpp )

使用DescriptorExtractor接口来寻找关键点对应的特征向量。

使用SurfDescriptorExtractor以及它的函数compute来完成特定的计算。

使用 BruteForceMatcher来匹配特征向量。

使用函数drawMatches来绘制检测到的匹配点。

Mat srcImage1 = imread("1.jpg", 1);
Mat srcImage2 = imread("2.jpg", 1);
 
//使用SURF算子检测关键点
//SURF算法中的hessian阈值
int minHessian = 700;

//定义一个SurfFeatureDetector(SURF)特征检测类对象
SurfFeatureDetector detector(minHessian);
std::vector<KeyPoint> keyPoints1, keyPoints2; //vector模板类,存放任意类型的动态数组

//调用detect函数检测出 SURF特征关键点,保存在vector容器中
detector.detect(srcImage1, keyPoints1);
detector.detect(srcImage2, keyPoints2);

//计算描述符(特征向量)
SurfDescriptorExtractor extractor;
Mat descriptors1, descriptors2;
extractor.compute(srcImage1,  keyPoints1,  descriptors1);
extractor.compute(srcImage2,  keyPoints2,  descriptors2);

//使用BruteForce进行匹配
//实例化一个匹配器
BruteForceMatcher<L2<float>> matcher;
std::vector<DMatch> matches;

//匹配两幅图中的描述子(descriptors)
matcher.match(descriptors1, descriptors2, matches);

//绘制从两个图像中匹配出的关键点
Mat imgMatches;
//进行绘制
drawMatches(srcImage1, keyPoints1, srcImage2, keyPoints2, matches, imgMatches);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值