OpenCV学习笔记(二)——特征提取与描述
1. 特征点简介
什么是特征点?大体上说就是图像中变化比较明显的点,比如角点或者边界,在一面白色的墙上是提取不到任何特征点的。特征点有点类似于矩阵的特征值(当然只是一个比喻),用少量的bit描述大部分的图像信息,不管在神经网络还是SLAM领域,特征点都有非常多的用途。
我们平时提到特征点一般包括特征提取子和特征描述子两部分,提取子就是先采用算法检测出来一定的特征,比如FAST特征子和SIFT特征自,然后我们要再对于特征进行描述,比如BRIEF描述子和SIFT描述子,描述子可以用来进行匹配,原理就是两个描述子的距离比较近意味着这两个特征子很相似。
下面介绍常用的三种特征子以及opencv的使用例程。
2. SURF(Speed Up Robust Feature)
Surf采用 Henssian 矩阵获取图像局部最值还是十分稳定的,但是在求主方向阶段太过于依赖局部区域像素的梯度方向,有可能使得找到的主方向不准确,后面的特征向量提取以及匹配都严重依赖于主方向,即使不大偏差角度也可以造成后面特征匹配的放大误差,从而匹配不成功。
Surf是一种只利用到灰度性质的算法,忽略了色彩信息。
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/nonfree/nonfree.hpp>
using namespace std;
using namespace cv;
int main(int argc, char *argv[])
{
// 读入图像
cv::Mat image = cv::imread("../demo1.jpeg");
cv::namedWindow("Original Image");
cv::imshow("Original Image", image);
// 特征点的向量
std::vector<cv::KeyPoint> keypoints;
// 构造SURF特征检测器
cv::SurfFeatureDetector surf;
//