【opencv学习笔记】SURF特征点检测

简介

特征检测

特征检测是从图像中自动提取对象特征用以表述该对象,
同时还可以利用得到的特征数据 描述在不同的图像中发现相同的对象,
(一旦得到两个对象的描述子,
就可以使用它们实现特征数据的匹配与比对,
从而分辨出它们是否具有相似性)
而且特征对对象的旋转、缩放、光照等具有不变性

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,和方向,是最能显示特征信息的一种绘制方式。

代码

# include <opencv2/opencv.hpp>
# include <opencv2/xfeatures2d.hpp>
using namespace std;
using namespace cv;
using namespace cv::xfeatures2d;

int main(int agrc, char** argv) {
	Mat src, dst;
	src = imread("E:/tuku/lang.jpg",IMREAD_GRAYSCALE);
	if (src.empty()) {
		cout << "can't find this picture...";
		return -1;
	}
	imshow("in put", src);
	namedWindow("out put", 1);
	//int minHessian = 400;
	int minHessian = 100; //值越小,特征点越多
	Ptr<SURF>detecor = SURF::create(minHessian);
	/*opencv中的Ptr指其使用的智能指针,指的
	是Template class for smart reference-counting pointers(智能指针模板类)
	而ptr是在访问图片中像素时的操作,如image.ptr<uchar>(5),指的是访问image图片的第6行像素值*/
	vector<KeyPoint> keypoints;
	detecor->detect(src, keypoints, Mat());
	drawKeypoints(src, keypoints, dst, Scalar::all(-1), DrawMatchesFlags::DEFAULT);
	imshow("out put", dst);
	waitKey(0);
	return 0;
}

效果图

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值