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);
《opencv学习笔记》-- SURF 特征提取
最新推荐文章于 2024-07-25 20:33:09 发布