2、特征提取与匹配
OpenCV中关于SURF算法的部分,常常涉及到的是SURF、SurfFeatureDetector、SurfDescriptorExtractor这三个类;
features2d.hpp头文件中,有:typedef SURF SurfFeatureDetector;和typedef SURF SurfDescriptorExtractor;typedef声明是为现有类型创建一个新的名字,类型别名,即SURF类有了两个新名字SurfFeatureDetector以及SurfDescriptorExtractor。
也就是说,SurfFeatureDetector类和SurfDescriptorExtractor类,其实就是SURF类,他们三者等价。
因此包含必要的头文件:
#include<iostream>
#include<stdio.h>
#include"highgui/highgui.hpp"
#include"opencv2/nonfree/nonfree.hpp"
#include"opencv2/legacy/legacy.hpp"
usingnamespace cv;
usingnamespace std;
2.1 拼接图像的加载:
实例:
MatimageRgbLeft = imread("img_left_1.JPG");
MatimageRgbRight = imread("img_right_1.JPG");
//灰度图转换,在特征提取与匹配模块使用灰度图像,因此需要将图像转为灰度图
MatimageGrayLeft, imageGrayRight;
cvtColor(imageRgbLeft,imageGrayLeft, CV_RGB2GRAY);
cvtColor(imageRgbRight,imageGrayRight, CV_RGB2GRAY);
2.2 提取特征点
实例:
intminHessian = 800; //设定阈值minHessian,关系到最后提取的特征点,这个是surf算法的一个参数;
SurfFeatureDetectorsurfDetector(minHessian); // 海塞矩阵阈值
vector<KeyPoint>keyPointLeft, keyPointRight;// 定义两个KeyPoint 向keypoints_object, keypoints_scene来存放检测出来的特征点;
surfDetector.detect(imageGrayLeft,keyPointLeft);
surfDetector.detect(imageGrayRight,keyPointRight);
2.3 drawKeypoints()
作用:绘制关键点。
形式:void drawKeypoints(const Mat&image, constvector<KeyPoint>& keypoints, Mat& outImage, constScalar&color=Scalar::all(-1), int flags=DrawMatchesFlags::DEFAULT );
参数:
image:const Mat&类型的src,输入图像;
keypoints:const vector<KeyPoint>&类型的keypoints,根据源图像得到的特征点,它是一个输出参数;
outImage:Mat&类型的outImage,输出图像,其内容取决于第五个参数标识符falgs;
color:const Scalar&类型的color,关键点的颜色,有默认值Scalar::all(-1);
flags:int类型的flags,绘制关键点是的特征标识符,有默认值DrawMatchesFlags::DEFAULT;
实例:
MatimageLeftPoint, imageRightPoint;
drawKeypoints(imageRgbLeft,keyPointLeft, imageLeftPoint, Scalar::all(-1), DrawMatchesFlags::DEFAULT);
imshow("imageLeftPoint",imageLeftPoint);
drawKeypoints(imageRgbRight,keyPointRight, imageRightPoint, Scalar::all(-1), DrawMatchesFlags::DEFAULT);