【持续更新篇】SLAM视觉特征点汇总+ORB特征点+VINS前端

news2024/11/15 10:33:43

Harris角点

opencv函数

cornerHarris提取输入图像的Harris角点

检测原理

检测思想:使用一个固定窗口在图像上进行任意方向的滑动,对比滑动前后的窗口中的像素灰度变化程度,如果存在任意方向上的滑动,都有较大灰度变化,则认为该窗口中存在角点。

E ( u , v ) = ∑ ( x , y ) ∈ W w ( x , y ) [ I ( x + u , y + v ) − I ( x , y ) ] 2 E(u, v)=\sum_{(x, y) \in W} w(x, y)[I(x+u, y+v)-I(x, y)]^{2} E(u,v)=(x,y)Ww(x,y)[I(x+u,y+v)I(x,y)]2

当窗口滑动时,滑动前后对应的窗口中的像素点灰度变化为 E ( u , v ) E(u, v) E(u,v)
E ( u , v ) E(u, v) E(u,v)进行泰勒展开,对公式进行化简,最终得到:

E ( u , v ) = [ u v ] M [ u v ] E(u, v)=\left[\begin{array}{ll}u & v\end{array}\right] M\left[\begin{array}{l}u \\ v\end{array}\right] E(u,v)=[uv]M[uv]

其中M为:

M = ∑ ( x , y ) ∈ W w ( x , y ) [ I x 2 I x I y I x I y I y 2 ] M = \sum_{(x, y) \in W} w(x, y)\left[\begin{array}{cc}I_{x}^{2} & I_{x} I y \\I_{x} I_{y} & I_{y}^{2}\end{array}\right] M=(x,y)Ww(x,y)[Ix2IxIyIxIyIy2]

I x I_x Ix为图像在x方向的梯度,y方向同理。

如果M没有梯度变化较大的点,则当前没有角点或边缘点。如果M只在一个方向上有梯度变化很大的点,则当前可能只有边缘点。若M在xy方向上均变换很大,则当前框内有角点。

角点相应得分:
R = det ⁡ ( M ) − k ( trace ⁡ ( M ) ) 2 R=\operatorname{det}(M)-k(\operatorname{trace}(M))^{2} R=det(M)k(trace(M))2

其中
det ⁡ ( M ) = λ 1 λ 2 \operatorname{det}(M)=\lambda_{1} \lambda_{2} det(M)=λ1λ2
trace ⁡ ( M ) = λ 1 + λ 2 \operatorname{trace}(M)=\lambda_{1}+\lambda_{2} trace(M)=λ1+λ2

k k k在0.04到0.06之间。 λ 1 λ 2 \lambda_{1} \lambda_{2} λ1λ2 M M M的两个特征值。

Harris角点性质

  1. 增大K值可以降低角点检测的灵敏度,减少被检测角点的数量
  2. Harris角点对亮度和对比度变化不灵敏
  3. Harris角点具有旋转不变性
  4. Harris角点不具有尺度不变性

FAST角点

opencv函数

fast = cv.FastFeatureDetector_create(threshold,nonmaxSuppression)
kp = fast.detect(Img, None)
cv.drawKeypoints (image,keypoints,outputimage,color,flags)

检测原理

取图像中的检测点,以该点为圆心的周围邻域内像素点判断检测点是否为角点。如果圆上有连续N个点的亮度大于或者小于阈值(如选取检测点的亮度的120%或80%),则认为该检测点为特征点。根据N的取值分为FAST-9,FAST-12等。

FAST加速方法

在FAST-12中可以检测圆上第1、5、9、13的像素的亮度,如果这四个像素中有三个同时大于或小于阈值,则该检测点才有可能是特征点,否则直接排除。

非极大值抑制

FAST角点会出现扎堆的现象,因此在第一遍检查过后还要使用非极大值抑制,在一定区域内仅保留响应极大值的角点,避免角点集中的问题。

FAST特征点性质

FAST特征点不具有方向信息和尺度信息。所以ORB在FAST基础上添加了图像金字塔解决尺度问题,添加灰度质心法解决特征的旋转问题。

SIFT特征点

src = cv.imread("123.png")
cv.namedWindow("input", cv.WINDOW_AUTOSIZE)
cv.imshow("input", src)
sift = cv.xfeatures2d.SIFT_create()
kps = sift.detect(src)
result = cv.drawKeypoints(src, kps, None, (0, 0, 255), cv.DrawMatchesFlags_DEFAULT)
cv.imshow("sift-detector", result)

SIFT原理

大致来说就是将图像进行多次下采样,构建出图像金字塔。
在这里插入图片描述

但是每层金字塔不止一张图像,而是类似于下面的一组图像。
在这里插入图片描述

原理是使用一个变化尺度的高斯函数与原图像进行卷积:
L ( x , y , σ ) = G ( x , y , σ ) ∗ I ( x , y ) L(x, y, \sigma)=G(x, y, \sigma) * I(x, y) L(x,y,σ)=G(x,y,σ)I(x,y)
其中高斯函数为:
G ( x , y , σ ) = 1 2 π σ 2 e − ( x − m / 2 ) 2 + ( y − n / 2 ) 2 2 σ 2 G(x, y, \sigma)=\frac{1}{2 \pi \sigma^{2}} e^{-\frac{(x-m / 2)^{2}+(y-n / 2)^{2}}{2 \sigma^{2}}} G(x,y,σ)=2πσ21e2σ2(xm/2)2+(yn/2)2

然后
在这里插入图片描述

画叉的特征点需要和本层的8个点外加上下两层的9个点共26个点比较,若为最大值或最小值,则认为该点是初步判断的一个特征点。

关键点剔除工作

因为我们得到的特征点可能并不是真正的极值点,因此我们将得到离散空间点进行拟合,求出真正的极值点。
在这里插入图片描述

我们将检测得到的特征点反复的向计算出的极值点的方向进行偏移(实际是导数为0的方向),排除掉超出设定的迭代次数依然不能收敛的特征点和超出图像边界的特征点。同时也要排除数值小于某个经验值的特征点(如小于0.03或0.04),因为这种数值小的点容易收到噪声的干扰。

这步完成后,我们还需要去掉边缘点。我们初步检测出来的特征点有很多都是在边缘处,因为边缘点有较大的响应,但是这种响应也只发生在一个方向,因此采用了类似于Harris角点的检测方法,求出该检测点在两个方向的Hession矩阵,计算Hession矩阵的特征值,如果两个特征值的和的平方除以两特征值的积小于设定的阈值(如1.2),则认为该点并不是边缘点,保留。
在这里插入图片描述

主方向分配

简单点说就是求出特征点的所有邻域梯度的方向,然后统计一下,哪种方向最大则认为该特征点的梯度方向,再选一个大于主梯度80%的方向作为辅方向,增加鲁棒性。

描述子

在这里插入图片描述

在关键点的44的窗口中计算分别计算八个方向的梯度作为该特征点的描述子,维度为44*8=128维

检测匹配方法

Kd平衡二叉树,查找与目标图像的特征点最邻近的原图像特征点和次邻近的原图像特征点

SIFT特征点性质

  1. 检测非常稳定,应用广泛
  2. 计算量大,很难做到实时

SURF特征点

opencv函数

img = cv.imread('photo.png',0)
surf = cv.xfeatures2d.SURF_create(400)
kp, des = surf.detectAndCompute(img,None)
len(kp)

检测原理(类比SIFT)

Hessian矩阵近似

给定图像中一点,可以确定如下的Hessian矩阵:
H ( x , y , σ ) = ( L x x L x y L x y L y y ) H(x, y, \sigma)=\left(\begin{array}{ll} L_{x x} & L_{x y} \\ L_{x y} & L_{y y} \end{array}\right) H(x,y,σ)=(LxxLxyLxyLyy)
其中 σ \sigma σ为尺度大小
计算Hessian矩阵的行列式值DoH为:
det ⁡ H = L x x L y y − L x y 2 \operatorname{det} H=L_{x x} L_{y y}-L_{x y}^{2} detH=LxxLyyLxy2
因为此处是对Hessian矩阵进行处理,所以会自动过滤掉边缘点。
检测时选择不同大小的 σ \sigma σ生成不同的高斯卷积模版,同样生成图像金字塔,然后在不同位置空间和尺度空间搜索DoH的峰值(同样是26个点),并进行非极大值抑制,得到图像的极值点。
实际运用中对高斯滤波和行列式的计算进行了简化

与SIFT特征点不同的
  1. SURF并没有通过降采样的方式得到不同尺寸大小的图像建立金字塔,而是借助于不同的 σ \sigma σ构造金字塔。
  2. 特征点的主方向SIFT在方形邻域窗口内统计梯度方向直方图,而SURF在圆形区域内计算各个扇形范围内的方向,取响应累加和最大的扇形方向。
  3. 特征描述子,SIFT将关键点附近的邻域划分成4*4的区域,统计每个子区域的梯度方向直方图,统计成128维特征向量。SURF将20乘20像素点的邻域划分成4乘4个子块,计算每个子块的Haar小波响应,并统计4个特征量,得到4乘4乘4=64维度的特征向量。

BRIEF描述子

描述子原理

BRIEF是一种二进制的描述子,其描述向量是0和1表示的二进制串。0和1表示特征点邻域内两个像素(p和q)灰度值的大小:如果p比q大则选择1,反正就取0。在特征点的周围选择128对这样的p和q的像素对,就得到了128维由0,1组成的向量。
BRIEF使用随机选点的比较,速度很快,而且使用二进制串表示最终生成的描述子向量,在存储以及用于匹配的比较时都是非常方便的,其和FAST的搭配起来可以组成非常快速的特征点提取和描述算法。

ORB特征点提取opencv特征点与匹配

源代码来源

import cv2 as cv

def ORB_Feature(img1, img2):

    # 初始化ORB
    orb = cv.ORB_create()

    # 寻找关键点
    kp1 = orb.detect(img1)
    kp2 = orb.detect(img2)

    # 计算描述符
    kp1, des1 = orb.compute(img1, kp1)
    kp2, des2 = orb.compute(img2, kp2)

    # 画出关键点
    outimg1 = cv.drawKeypoints(img1, keypoints=kp1, outImage=None)
    outimg2 = cv.drawKeypoints(img2, keypoints=kp2, outImage=None)
	
	# 显示关键点
    # import numpy as np
    # outimg3 = np.hstack([outimg1, outimg2])
    # cv.imshow("Key Points", outimg3)
    # cv.waitKey(0)

    # 初始化 BFMatcher
    bf = cv.BFMatcher(cv.NORM_HAMMING)

    # 对描述子进行匹配
    matches = bf.match(des1, des2)

    # 计算最大距离和最小距离
    min_distance = matches[0].distance
    max_distance = matches[0].distance
    for x in matches:
        if x.distance < min_distance:
            min_distance = x.distance
        if x.distance > max_distance:
            max_distance = x.distance

    # 筛选匹配点
    '''
        当描述子之间的距离大于两倍的最小距离时,认为匹配有误。
        但有时候最小距离会非常小,所以设置一个经验值30作为下限。
    '''
    good_match = []
    for x in matches:
        if x.distance <= max(2 * min_distance, 30):
            good_match.append(x)

    # 绘制匹配结果
    draw_match(img1, img2, kp1, kp2, good_match)

def draw_match(img1, img2, kp1, kp2, match):
    outimage = cv.drawMatches(img1, kp1, img2, kp2, match, outImg=None)
    cv.imshow("Match Result", outimage)
    cv.waitKey(0)

if __name__ == '__main__':
    # 读取图片
    image1 = cv.imread('1.png')
    image2 = cv.imread('2.png')
    ORB_Feature(image1, image2)

VINS前端光流法

vins-mono前端流程
在这里插入图片描述

光流追踪:基于灰度不变假设,以上一帧的特征点坐标为起点,在当前帧的同样的坐标下以一定范围找到与上一帧特征点附近区域灰度值相近的区域。

图像金字塔:vins中把上一层图像金字塔追踪的结果作为下一帧图像金字塔追踪的初值。保证了像素精度又保证了追踪结果在还原时的准确度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/416674.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Jetpack Compose 实战 宝可梦图鉴

文章目录前言实现效果一、架构介绍二、一些的功能点的介绍加载图片并获取主色,再讲主色设置为背景一个进度缓慢增加的圆形进度条单Activity使用navigation跳转Compose可组合项返回时页面重组的问题hiltViewModel()主要参考项目总结前言 阅读本文需要一定compose基础&#xff0…

Python爬虫|全国补充耕地项目数量爬取与分析——多进程案例

一、使用的库 import requests from lxml import etree import time import random import re import openpyxl import openpyxl from pyecharts.charts import Bar, Pie from pyecharts import options as opts from multiprocessing.dummy import Pool 二、数据爬取思路 1…

手拉手Centos7安装配置Redis7

Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 Redis是一个NoSQL数据库&#xff0c;常用缓存(cache) Re…

Spark 安装及WordCount编写(Spark、Scala、java三种方法)

Spark 官网&#xff1a;Apache Spark™ - Unified Engine for large-scale data analytics Spark RDD介绍官网&#xff1a;https://spark.apache.org/docs/2.2.0/api/scala/index.html#org.apache.spark.rdd.RDD 下载好spark解压mv到软件目录 linux>mv spark-xxx-xxx /op…

统计套利策略

统计套利策略套利策略跨品种套利标的择时风控套利策略 套利是&#xff0c;某种商品在&#xff08;在同一市场或不同市场&#xff09;拥有两个价格的情况下&#xff0c;以较低的价格买进&#xff0c;较高的价格卖出&#xff0c;从而实现获利的交易方式。 比如咖啡店里有小杯、…

【jvm系列-04】精通运行时数据区共享区域---堆

JVM系列整体栏目 内容链接地址【一】初识虚拟机与java虚拟机https://blog.csdn.net/zhenghuishengq/article/details/129544460【二】jvm的类加载子系统以及jclasslib的基本使用https://blog.csdn.net/zhenghuishengq/article/details/129610963【三】运行时私有区域之虚拟机栈…

chapter-6数据库设计原则

以下课程来源于MOOC学习—原课程请见&#xff1a;数据库原理与应用 考研复习 数据库设计 数据库设计是基于应用系统需求分析中对数据的需求&#xff0c;解决数据的抽象、数据的表达和数据的存储等问题&#xff0c;其目标是设计出一个满足应用要求&#xff0c;简洁、高效、规范…

【c语言】二维数组

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ…

「计算机控制系统」3. 计算机控制系统的数学描述

差分方程 Z变换 脉冲传递函数 计算机控制系统的响应 文章目录差分方程基础知识差分方程的解Z变换定义与性质求Z变换Z变换表求Z反变换用Z变换解差分方程脉冲传递函数脉冲传递函数与差分方程的相互转化开环脉冲传递函数闭环脉冲传递函数计算机控制系统的响应差分方程 基础知识 …

Photoshop CS6安装包下载及安装教程(Photoshop 2016)

下载链接&#xff1a; https://pan.quark.cn/s/f961759b36cc “Adobe Photoshop是一款集图像扫描、编辑修改、图像制作、广告创意、图像输入输出于一体的图形图像处理软件,简称ps,对于这款软件大家应该并不陌生,而今天小编带来的是Photoshop2023中文版,也是该系列的最新版本,不…

WAF攻防-菜刀冰蝎哥斯拉流量通讯特征绕过检测反制感知

文章目录菜刀-流量&绕过&特征&检测特征绕过检测冰蝎3-流量&绕过&特征&检测特征通讯过程检测绕过哥斯拉-流量&绕过&特征&检测特征Other使用Proxifier进行流量转发至Burp抓包分析(使用Wireshake也可以) 菜刀-流量&绕过&特征&检…

Java阶段一Day21

Java阶段一Day21 文章目录Java阶段一Day21多线程并发原理使用场景创建并启动线程创建线程的方法进程线程的生命周期获取线程信息的方法教师总结新单词多线程概念线程:一个顺序的单一的程序执行流程就是一个线程。代码一句一句的有先后顺序的执行。多线程:多个单一顺序执行的流程…

最新!AI第一次有了国家标准,北大、华为、百度等单位共同编制

最近&#xff0c;国家标准全文公开系统网站正式发布了国家标准《神经网络表示与模型压缩 第一部分&#xff1a;卷积神经网络》&#xff08;GB/T 42382.1-2023&#xff09;&#xff0c;此标准由北京大学、鹏城实验室、华为、百度等16家单位共同编制。 &#xff08;来源&#xff…

考试前临时抱佛脚有用吗?这篇复习攻略会告诉你答案

夏天来了&#xff0c;大家的期末考试也将不远了。不知平时大家是如何准备考试的&#xff0c;是平时学习计划有序进行复习&#xff0c;还是考试前临时抱佛脚呢&#xff1f;今天就来跟大家讲一讲&#xff0c;学习中很重要的一个环节&#xff0c;如何复习。所以敲黑板&#xff0c;…

基于 AT89C51 单片机的数字时钟设计

目录 1.设计目的、作用 2.设计要求 3.设计的具体实现 3.1 设计原理 3.2 硬件系统设计 3.2.1 AT89C51 单片机原理 3.2.2 晶振电路设计 3.2.3 复位电路设计 3.2.4 LED 数码管显示 3.3 系统实现 3.3.1 系统仿真与调试 3.3.2 演示结果 4.总结 附录 附录 1 附录 2 1.…

【JVM】常量池

常量池&#xff08;Runtime Constant Poo&#xff09; 常量池Java中可以分为三种&#xff1a;字符串常量池&#xff08;堆&#xff09;、Class文件常量池、运行时常量池&#xff08;堆&#xff09;。 1.字符串常量池&#xff08;String Pool&#xff09; 为了提升性能和减少…

C++变量限定

C的变量限定指可以在变量类型的基础上加上特殊的限定条件&#xff0c;主要包括&#xff1a;是不是const&#xff0c;是不是volatile&#xff0c;是左值还是右值&#xff0c;是不是引用&#xff0c;是左值引用还是右值引用&#xff0c;等等。 1. 为什么要研究这个东西 主要是c…

练习之烦人的递归

文章目录1.删除公共字符2.读入一串以?结束的字符串&#xff0c;逆序输出。法一&#xff1a;常规递归法二&#xff1a;投机取巧3.递归将整数输出为字符串4.递归输出1--n的平方和5.递归计算222222...6.递归求最大公约数7.递归输出x的n次方8. 递归计算下列式子的值1.删除公共字符…

从FPGA说起的深度学习(六)-任务并行性

这是新的系列教程&#xff0c;在本教程中&#xff0c;我们将介绍使用 FPGA 实现深度学习的技术&#xff0c;深度学习是近年来人工智能领域的热门话题。在本教程中&#xff0c;旨在加深对深度学习和 FPGA 的理解。用 C/C 编写深度学习推理代码高级综合 (HLS) 将 C/C 代码转换为硬…

还在回想Midjourney的参数,Claude来帮你

本来是想整理一份Midjourne使用的参数表&#xff0c;看来是不用了&#xff0c;Claude很方便的就能帮到我们。 问下Claude: 你知道 Midjourne 的参数吗 Claude 回答如下&#xff1a; 是回答出来了&#xff0c;但是并不是非常的好&#xff0c;我们继续引导他一下&#xff1a; 你…