在Opencv3之后的版本,关于SURF特征点检测,除了头文件中模块的改变之外,还有程序用法的改变。(运行这个程序时,我用的VS2019+Opencv4.1.1)
不同之处:
①头文件中模块的位置改变了
②增加xfeatures2d命名空间(否则会显示未定义标识符SURF)
③SurfFeatureDetector detector(minHessian) 改成:
Ptr detector = SURF::create(minHessian);
④detector.detect( srcImage1, keypoints_1 );
detector.detect( srcImage2, keypoints_2 ); 改成:
detector->detect(srcImage1, keypoints_1);
detector->detect(srcImage2, keypoints_2);
一.SURF算法
特征检测
尺度空间
选择不变性:光照不变性、旋转不变性
特征向量
二.SURF算法原理
(这里不再赘述,书上讲的很明白)
三.API的介绍
cv::xfeatures2d::SURF::creat(double HessianThreshold = 100.
int nOctaves = 4,
int nOctaveLayers = 3,
bool extend = false,
bool upright = false
)
//upright = 0 表示计算选择不变性,1表示不计算,速度更快
//HessianThreshold默认值在300——500之间
//nOctaves = 4 表示四个尺度空间
//nOctaveLayers 表示每个尺度的层数
drawKeypoints()函数
//(书上讲的很详细,看书即可)
四.源码(与书上进行比较,注意不同的地方)
#include <opencv2/core/core.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/highgui/highgui.hpp>
#include<opencv2/xfeatures2d/nonfree.hpp>
#include <iostream>
using namespace cv;
using namespace std;
using namespace xfeatures2d;
int main(int argc, char** argv)
{
//【0】改变console字体颜色
system("color 2F");
//【1】载入源图片并显示
Mat srcImage1 = imread("E:\\pictures\\27.jpg", 1);
Mat srcImage2 = imread("E:\\pictures\\28.jpg", 1);
if (!srcImage1.data || !srcImage2.data)//检测是否读取成功
{
printf("读取图片错误! \n"); return false;
}
imshow("原始图1", srcImage1);
imshow("原始图2", srcImage2);
//【2】定义需要用到的变量和类
int minHessian = 400;//定义SURF中的hessian阈值特征点检测算子
Ptr<SURF> detector = SURF::create(minHessian); //指针数组
vector<KeyPoint> keypoints_1, keypoints_2;//vector模板类是能够存放任意类型的动态数组,能够增加和压缩数据
//【3】调用detect函数检测出SURF特征关键点,保存在vector容器中
detector->detect(srcImage1, keypoints_1);
detector->detect(srcImage2, keypoints_2);
//【4】绘制特征关键点.
Mat img_keypoints_1; Mat img_keypoints_2;
drawKeypoints(srcImage1, keypoints_1, img_keypoints_1, Scalar::all(-1), DrawMatchesFlags::DEFAULT);
drawKeypoints(srcImage2, keypoints_2, img_keypoints_2, Scalar::all(-1), DrawMatchesFlags::DEFAULT);
//【5】显示效果图
imshow("特征点检测效果图1", img_keypoints_1);
imshow("特征点检测效果图2", img_keypoints_2);
waitKey(0);
return 0;
}
输出结果: