SURF(Speeded UP Robust Features)特征关键特性
- 特征检测
- 尺度空间
- 选择不变形
- 特征向量
工作原理
- 选择图像中POI(
Points of Interest
)Hessian Matrix - 在不同的尺度空间发现关键点,非最大信号抑制
- 发现特征点方向、旋转不变性要求
- 生成特征向量
具体算法不擅长,请参考:
https://www.cnblogs.com/gfgwxw/p/9415218.html
函数API
SURF对象创建函数api
Ptr<SURF> cv::xfeatures2d::SURF::create (
double hessianThreshold = 100,
int nOctaves = 4,
int nOctaveLayers = 3,
bool extended = false,
bool upright = false
)
参数介绍
- hessianThreshold hessian关键点检测器的阈值,默认在300-500之间
- nOctaves 表示在4个尺度空间(用高斯尺度变化来模拟SIFR金字塔缩放,这里表示缩放级数,一般四级足够用了)
- nOctaveLayers 每个尺度空间的层数最少三层
- extended 扩展描述符标志,描述子(true使用扩展的128个元素的描述符,false使用64个元素的描述符
- upright 选择是否计算旋转不变性,true不计算速度快,false计算速度稍慢).
SURF提取关键点函数api
void cv::xfeatures2d::SURF::detect( InputArray image,
vector<KeyPoint>& keypoints,
InputArray mask=noArray()
);
函数参数介绍
- image 待检测的图像
- keypoints 检测到的关键点集合
- mask 指定在哪里寻找关键点的掩码(必须是在感兴趣区域中具有非零值的8位整数矩阵)
SURF绘制关键点函数api
cv::drawKeypoints(InputArray image,
vector<KeyPoint>& keypoints,
InputOutputArray outImage,
const Scalar& color=Scalar::all(-1),
int flags=DrawMatchesFlags::DEFAULT
);
函数参数介绍
- image 进行绘制的图像
- keypoints 来自源图像的关键点
- outImage 绘制完成后输出图像
- color 关键点的颜色 默认值随机值
- DrawMatchesFlags 设置绘图功能的标志 默认圆圈
代码演示
#include <iostream>
#include <opencv2/opencv.hpp>
#include <math.h>
#include <opencv2/xfeatures2d.hpp>
using namespace std;
using namespace cv;
using namespace cv::xfeatures2d;
#define Pic_Path "C://pic//"
#define Pic_Name "3.jpg"
int main(void)
{
Mat src,dst, gray_src;
string pic = string(Pic_Path) + string(Pic_Name);
cout << "打开图片路径:" << pic << endl;
src = imread(pic);
if (src.empty())
{
cout << "图片不存在或打开失败" << endl;
return -1;
}
namedWindow("原始图片", WINDOW_AUTOSIZE);
imshow("原始图片", src);
//图片转换为灰度图像
cvtColor(src, gray_src, COLOR_BGR2GRAY);
//创建SURF对象
double hessianThreshold = 400; //检测阈值
vector<KeyPoint> keypoints; //关键点的集合
Ptr<SURF> surf = cv::xfeatures2d::SURF::create(hessianThreshold, 4, 3, false, true); //初始化SURF对象
surf->detect(gray_src, keypoints); //检测关键点
dst = src.clone(); //拷贝原图 用于在原图上显示关键点
drawKeypoints(dst, keypoints, dst); //绘制关键点
//显示检测结果
namedWindow("检测图片", WINDOW_AUTOSIZE);
imshow("检测图片", dst);
waitKey(0);
destroyAllWindows();
return 0;
}