SURF可以用于对象定位和识别、人脸识别、3D重建、对象跟踪和提取兴趣点等。常用来进行物体辨识和图像匹配。
1.SURF 全称 speed up robust feature 是加速版的SIFT
2.如何提取SURF特征?两步:检测和描述
- 检测特征点
- 描述特征点
3.什么样的点是特征点?
它首先是图像中得一个点,这个点具有这样一些特性:
- 容易被检测到,只要这个点所对应的那个物体还在摄像头的视野范围内,那么这个点就能被检测出来。比如角点,边界点,亮处的暗点,暗处的亮点等,一言以蔽之,就是与周围有反差的点
- 不受明暗光线变化的影响
核心函数:
类SURF中成员函数create()参数说明:
static Ptr<SURF> create(double hessianThreshold=100, //hessian关键点检测器的阈值,默认在300-500之间
int nOctaves = 4, //表示在4个尺度空间
int nOctaveLayers = 3, //每个尺度空间的层数
bool extended = false, //扩展描述符标志(true使用扩展的128个元素的描述符,false使用64个元素的描述符)
bool upright = false//旋转的特征标志(true不计算方向,false计算方向)
);
函数detect()用来检测图像或图像集中的关键点,参数说明
void detect( InputArray image, //图像
vector<KeyPoint>& keypoints,// 检测到的关键点
InputArray mask=noArray() //指定在哪里寻找关键点的掩码(必须是在感兴趣区域中具有非零值的8位整数矩阵)
);
函数drawKeypoints()绘制关键点,参数说明:
void drawKeypoints(InputArray image, //源图像
vector<KeyPoint>& keypoints, //来自源图像的关键点
InputOutputArray outImage,//输出图像
const Scalar& color=Scalar::all(-1), //关键点的颜色
int flags=DrawMatchesFlags::DEFAULT //设置绘图功能的标志
);
特征点提取代码示例:
#include <iostream>
#include "opencv2/opencv.hpp"
#include "opencv2/xfeatures2d/nonfree.hpp"
using namespace cv;
using namespace cv::xfeatures2d;
using namespace std;
int main(int argc, char** argv)
{
Mat src = imread("D:/cv400/data/lena.jpg", 0);
if (src.empty())
{
cout<<"could not load image..."<<endl;
return -1;
}
namedWindow("input image", WINDOW_AUTOSIZE);
imshow("input image", src);
double t1 = (double)getTickCount();
// SURF特征检测
int minHessian = 400;
Ptr<SURF> detector = SURF::create(minHessian);
vector<KeyPoint> keypoints;
detector->detect(src, keypoints, Mat());
double t2 = (double)getTickCount();
double t = (t2-t1) / getTickFrequency();
cout << "spend time: " << t << " s"<<endl;
// 绘制关键点
Mat keypoint_img;
drawKeypoints(src, keypoints, keypoint_img, Scalar::all(-1), DrawMatchesFlags::DEFAULT);
imshow("KeyPoints Image", keypoint_img);
waitKey(0);
return 0;
}
运行截图:
速度挺快,此图39ms