简介
特征检测
特征检测是从图像中自动提取对象特征用以表述该对象,
同时还可以利用得到的特征数据 描述在不同的图像中发现相同的对象,
(一旦得到两个对象的描述子,
就可以使用它们实现特征数据的匹配与比对,
从而分辨出它们是否具有相似性)
而且特征对对象的旋转、缩放、光照等具有不变性
SURF(speed up robust feature)是加速版的SIFT
- SURF可以用于对象定位和识别、人脸识别、3D重建、对象跟踪和提取兴趣点等。常用来进行物体辨识和图像匹配。
- 检测可分为三步
< 1 > 检测特征点
< 2 > 描述特征点
< 3 > 匹配特征点 - 特征点的特性
一、 容易被检测到,只要这个点所对应的那个物体还在摄像头的视野范围内,那么这个点就能被检测出来。比如角点,边界点,亮处的暗点,暗处的亮点等,一言以蔽之,就是与周围有反差的点
二、 不受明暗光线变化的影响
相关函数介绍
1. 构造函数
类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计算方向)
);
2.KeyPoint类
KeyPoint类是一个为特征点检测而生的数据结构,用于形容特征点。
class KeyPoint
{
Point2f pt; // 坐标
float size; // 特征点领域直径
float angle; // 特征点的方向
float response;
int octave; // 特征点所在的图像金字塔的组
int class_id; // 用于聚类的id
}
3.detect()函数
用来检测图像或图像集中的关键点。
void detect( InputArray image, //图像
vector<KeyPoint>& keypoints,// 检测到的关键点
InputArray mask=noArray() //指定在哪里寻找关键点的掩码(必须是在感兴趣区域中具有非零值的8位整数矩阵)
);
4.drawKeypoints()函数
绘制关键点
void drawKeypoints(InputArray image,
//源图像
vector<KeyPoint>& keypoints,
//根据源图像得到的特征点,输出参数
InputOutputArray outImage,
//输出图像,其内容取决于第五个参数
const Scalar& color=Scalar::all(-1),
//关键点的颜色
int flags=DrawMatchesFlags::DEFAULT
//设置绘图功能的标志
);
关于第五个参数
- DEFAULT=0:只绘制特征点的坐标点,显示在图像上就是一个个小圆点,每个小圆点的圆心坐标都是特征点的坐标。
- DRAW_OVER_OUTIMG=1:函数不创建输出的图像,而是直接在输出图像变量空间绘制,要求本身输出图像变量就是一个初始化好了的,size与type都是已经初始化好的变量
- NOT_DRAW_SINGLE_POINTS=2:单点的特征点不被绘制
- DRAW_RICH_KEYPOINTS=4:绘制特征点的时候绘制的是一个个带有方向的圆,这种方法同时显示图像的坐标,size,和方向,是最能显示特征信息的一种绘制方式。