SURF 特征点检测

SURF可以用于对象定位和识别、人脸识别、3D重建、对象跟踪和提取兴趣点等。常用来进行物体辨识和图像匹配。

1.SURF 全称 speed up robust feature 是加速版的SIFT

2.如何提取SURF特征?两步:检测和描述

  • 检测特征点
  • 描述特征点

3.什么样的点是特征点?

  它首先是图像中得一个点,这个点具有这样一些特性:

  1. 容易被检测到,只要这个点所对应的那个物体还在摄像头的视野范围内,那么这个点就能被检测出来。比如角点,边界点,亮处的暗点,暗处的亮点等,一言以蔽之,就是与周围有反差的点
  2. 不受明暗光线变化的影响

核心函数:

类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
 

猜你喜欢

转载自blog.csdn.net/andylanzhiyong/article/details/84676985