当前位置: 首页 > news >正文

OpenCV第十三讲:SURF特征点的检测与匹配详解

Dog算子,SIFT特征点, Fast角点 ,ORB特征点 有时间慢慢再来解析

1. SURF的优势

  • SURF主要有以下几点优势

    • SURF是尺度不变特征变换算法(SIFT)加速版,一般来说它比SIFT要快好几倍,且在多幅图像下具有更好的稳定性

    • SURF采用了harr特征+积分图像的概念,大大加快了程序的运行时间。

    • SURF可以应用于计算机视觉的物体识别以及3D重构

2.SURF算法原理

1. 构建Hessian矩阵, 构造高斯金字塔尺度空间

SURF构造的金字塔图像与SIFT有很大不同,是造成SURF快很多的原因之一。

Sift采用的是Dog算子, 而surf采用的是Hessian矩阵行列式近似值图像, Hessian矩阵是Surf算法的核心

但由于特征点需要具备尺度无关性,所以在在计算Hessian矩阵之前,需要对其进行高斯滤波

  • 首先判断该点是否为极值点,才可以决定是否选择其为特征点

    判别式的就是Hessian矩阵的行列式, 缩写为det(H), 判别式的值就是H矩阵的的特征值,然后根据判别式的值从而可以判定该点是是不是极值点。

    海森矩阵(Hessian): 是一个自变量为向量的二阶偏导数组成的方块矩阵,如下:
    在这里插入图片描述

    它的判别式为:
    在这里插入图片描述

在SURF算法中,为了计算Hessian矩阵,我们选用二阶标准高斯函数作为滤波器, 通过特定核间的卷积计算二阶偏导数,从而可以得到H矩阵
在这里插入图片描述

L ( x , t ) = G ( t ) ⋅ I ( x , t ) L(x, t)=G(t) \cdot I(x, t) L(x,t)=G(t)I(x,t), G ( t ) = ∂ 2 g ( t ) ∂ x 2 G(t)=\frac{\partial^{2} g(t)}{\partial x^{2}} G(t)=x22g(t).

为应用方便, 有人(Herbert Bay)提出了用近似值先代替L(x,t), 为了平衡误差引入权值,权值随着尺度变换, 则H矩阵的判别式可表示为:

det ⁡ ( H ) = D x x D y y − ( 0.9 D x y ) 2 \operatorname{det}(\text {H})=D x x D y y-\left(0.9 D_{x y}\right)^{2} det(H)=DxxDyy(0.9Dxy)2

  • SURF相比对SIFT加速的两个地方

    • 积分图(提高计算效率):就是当前的每个像素的灰度都是它与坐标原点(0,0)形成的对角线的矩形内的所有像素的灰度值之和。所以我们在计算某个矩阵框内的像素灰度值之和时,就可以很快得出结果。
    • 图像金字塔:sift的图像金字塔是逐渐降采样得到的(图像像素降低);而Surf中,图像大小始终保持不变,改变的是滤波器的大小(就是核的尺寸), 这样节省了降采样过程,所以速度提升了。

2. 利用非极大值抑制初步确定特征点

初步特征点的确定: 将经过hessian矩阵处理过的每个像素点与其3维领域的26个点(每个平面9个点再除去自身)进行大小比较,如果它是这26个点中的最大值或者最小值,则保留下来,当做初步特征点

3. 精确定位极值点

和sift算法类似,采用三维线性插值法得到亚像素级的特征点,同时也去掉那些值小于一定阈值的点,增加极值使检测到的特征点数量减少,最终只有几个特征最强点会被检测出来。

4. 选取特征点的主方向

  • sift选取特征点主方向

    采用在特征点领域内统计其梯度直方图, 取直方图bin值最大的以及超过最大bin值80%的那些方向作为其特征点的主方向。

梯度直方图不熟,记个标签,后面专门补上。

  • SURF选取特征点主方向

    不统计其梯度直方图, 而是统计特征点领域内的harr小波特征。即以特征点为中心,统计在一定半径范围内,以60°的扇形区域内x-y方向上的Haar小波响应总和,并给这些响应值按照离特征点的远近赋予不同程度的权重, 最后将最大值那个扇形的作为该特征点的主方向。该过程的示意图如下:

    在这里插入图片描述

haar小波特征不熟,记个标签2,后面补上更新

5. 构造SURF特征点描述算子

  • sift描述子的选取方式

    在sift中,是在特征点周围取16x16的邻域, 并把该领域化为4x4个的小区域,每个小区域统计8个方向梯度,最后得到448 = 128维的向量, 将该向量作为该点的描述子

  • SURF描述子的选取方式

    在surf中,是在特征点周围去一个正方形框,该框是有方向的,与上的一步的主方向统一。 然后将该框分为44个小区域,对每个小区域统计25个像素的水平方向和垂直方向的haar小波特征,这里的水平和垂直方向是相对主方向而言的。就可以得到4个值:该haar小波特征的水平方向值之和,水平方向绝对值之和,垂直方向之和,垂直方向绝对值之和。所以从以上可以看出,最后得到44*4=64维的向量, 该向量与sift的向量相比少了一半。

3. SURF缺点

在上面讲述SURF的原理过程中,都与sift特征进行了对比, 突出了surf特征的优势所在,那么现在分析一下surf有那些缺点:

  • 求主方向阶段太过于依赖局部区域像素的梯度方向

    这有可能使得找到的主方向不准确,而后面的特征向量提取以及匹配都严重依赖于主方向,即便不大偏差角度也可以造成后面特征匹配的误差放大,从而使匹配不成功。

  • 图像金字塔的层取得不够紧密

    这会使得尺度有误差, 后面的特征向量提取同样依赖相应的尺度,研究者们在这个问题上的解决方法是取适量的层然后进行插值

4.SURF特征的提取和匹配–OpenCV函数

  • OpenCV3总SURF/SIFT特征点的检测
		int minHessian = 400; ## 检测关键点的数量
		cv::Ptr<xfeatures2d::SURF> detector = xfeatures2d::SURF::create( minHessian );
		cv::Ptr<xfeatures2d::SIFT> detectorSift = xfeatures2d::SIFT::create(minHessian);
		## 画出关键点位置
		drawKeypoints(image1, kyPoints1, img_kyPoints1, cv::Scalar::all(-1), DrawMatchesFlags::DEFAULT);  
  • OpenCVC3中特征点的匹配方式
		vector<DMatch> matches;
		FlannBasedMatcher matcher;
		matcher.match(descrip1, descrip2, matches);
		# 画出匹配的关键点
		drawMatches ( image1, kyPoints1, image2, kyPoints2, matches, img_matches );
  • 测试结果简单展示

在这里插入图片描述

4. SURF特征与SIFT特征各项指标对比

在这里插入图片描述

且理论上, SURF比SIFT快3倍。

相关文章:

  • OpenCV第十四讲: Fast特征点与ORB特征点原理详解
  • DAVIS第一课: 事件相机的工作原理和相关核心功能简介
  • DAVIS第二课:基于事件相机的视觉里程计
  • Rtab-Map学习之rtabmap_ros源代码剖析
  • DAVIS前言:事件相机资料调研
  • DAVIS第三课: 基于事件相机的光流法计算
  • CUDA学习第一天: 基础概念扫盲
  • CUDA学习第二天: GPU核心与SM核心组件
  • DAVIS第四课:基于DAVIS的特征点检测和追踪
  • CUDA学习第三天:Kernel+grid+block关系
  • DAVIS第五课: 基于事件相机的一种几何实时3DSLAM算法
  • ubuntu学习技巧1:容易混淆但又重要的命令
  • RGB颜色空间对应的不同颜色列表
  • V-SLAM重读(1): SVO: Fast Semi-Direct Monocular Visual Odometry
  • C++11回顾学习(4): 语法解析之虚函数与继承
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Angularjs之国际化
  • Git 使用集
  • JDK9: 集成 Jshell 和 Maven 项目.
  • npx命令介绍
  • Ruby 2.x 源代码分析:扩展 概述
  • Terraform入门 - 1. 安装Terraform
  • Vue.js源码(2):初探List Rendering
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 初识 webpack
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 从0实现一个tiny react(三)生命周期
  • 电商搜索引擎的架构设计和性能优化
  • 服务器从安装到部署全过程(二)
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 入门级的git使用指北
  • 三栏布局总结
  • 手写一个CommonJS打包工具(一)
  • 数组大概知多少
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • 进程与线程(三)——进程/线程间通信
  • ​力扣解法汇总946-验证栈序列
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #14vue3生成表单并跳转到外部地址的方式
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #pragam once 和 #ifndef 预编译头
  • (3)(3.5) 遥测无线电区域条例
  • (Java数据结构)ArrayList
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (八)Flask之app.route装饰器函数的参数
  • (二)换源+apt-get基础配置+搜狗拼音
  • (力扣)1314.矩阵区域和
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失