【视觉SLAM入门】5.1. 特征提取和匹配--FAST,ORB(关键点描述子),2D-2D对极几何,本质矩阵,单应矩阵,三角测量,三角化矛盾

"不言而善应"

  • 0. 基础知识
  • 1. 特征提取和匹配
    • 1.1 FAST关键点
    • 1.2 ORB的关键点--改进FAST
    • 1.3 ORB的描述子--BRIEF
    • 1.4 总结
  • 2. 对极几何,对极约束
    • 2.1 本质矩阵(对极约束)
    • 2.2 单应矩阵(特别提一下)
    • 2.3 三角测量(Triangulation)---深度信息

为什么重要?我们是在做什么事?

  • 特征提取和匹配: 首先是两幅图像的特征提取,然后是对应特征点的匹配。接下来的工作是根据得到的匹配点对,估计相机的运动,具体根据相机分为三种方法:
    • 单目相机:2D-2D: 对极几何 方法
    • 双目或者RGBD相机: 3D-3D: ICP 方法
    • 一个3D点和它相机中的投影位置: 3D-2D : PnP 方法

0. 基础知识

视觉SLAM两阶段:

  • 前端(VO) —> 粗略相机运动 ------> 提供给后端初始值
  • 后端 —> 优化

VO的实现方法两派:

  • 不提取特征点 ----> 直接法
  • 提取特征点 ------> 特征点法 ----> 成熟

1. 特征提取和匹配

注意:有些东西的作用你要明白:

  • 关键点: 是在一幅图像中找到的点,作用是在一幅图中找到路标点(有代表性的点)。
  • 描述子: 在两个图像的关键点找到的情况下,匹配两个图像中的对应关键点。 通常是向量
  • 特征点: 由关键点和描述子两部分组成,任务是(提取XXX关键点,计算XXX描述子)
  • 尺度不变性: 为了确保从远到近都能检测出来关键点
  • 旋转不变性: 为了确保图像旋转后还能检测出来关键点
  • 特征提取的是关键点和描述子,特征匹配是根据描述子匹配的

几种图像特征:

  • SIFT特征:计算量太大,有些精确
  • FAST关键点:没有描述子,最快,不准。
  • ORB特征:改进FAST关键点,采用BRIEF描述子

1.1 FAST关键点

    1. 比较周围半径圆范围内的灰度情况,差别大就是角点。
    1. 设定一个数量,比如9,范围内至少有连续9个点和选定点的亮度色差大于阈值T的时候,该点就称为特征点。这种方法叫FAST-9。
    1. 检测完角点扎堆,非极大值抑制

1.2 ORB的关键点–改进FAST

改进了FAST关键点法,克服了缺点:

    1. 可以指定提取数量: 对点分别计算Harris相应,取前N个响应最大的角点;
    1. 尺度不变性: 用图像金字塔提取每一层的角点,均为角点才是角点;
    1. 旋转不变性:灰度质心法,保证图像旋转后还能检测到。最后得到的是角度,从图像光度明指向光度暗的一侧,具体实现如下:

在这里插入图片描述

1.3 ORB的描述子–BRIEF

作用:为了保证两个图像中提取出的关键点能对应上各自匹配的点对。

  • BRIEF是二进制描述子,描述向量由0和1组成
  • 做法:选取关键点周围的图像块,随机选取像素点对(有很多选点方法),如128就是取128个点对,设两个点像素分别为 p , q p, q p,q , 然后计算 p , q p, q p,q 的大小关系,按结果分别记为0,1, 最后得到128位的二进制数。匹配的时候在第二幅图像中也用相同的选点方法,最后比较两幅图像中关键点描述子距离(二进制的字串衡量就是汉明距离)。

1.4 总结

通过图像特征点的对应关系,解决了SLAM最重要的一步:同一个点在不同图像中如何检测出来
特征匹配的方法有:

  • 暴力匹配(Brute-Force Matcher): 第二幅图像中每个点都计算其在第一幅图对应的特征点,运算量大;
  • 快速最近邻(FLANN): 适用于匹配点数量多
  • 。。。

2. 对极几何,对极约束

目的是求相机运动 R , t R, t R,t,内参一般知道

这是2D-2D的单目情形,假设相机经过一次运动 R , t R, t R,t 后得到的两帧图如下:

图源SLAM14讲
其中点和线定义如下:

  • p 1 , p 2 p_1,p_2 p1,p2 : 分别同一个点在两帧下的投影点
  • O 1 , O 2 O_1, O_2 O1,O2 : 相机光心
  • P P P : 真实世界中的点
  • I 1 , I 2 I_1, I_2 I1,I2 : 两帧图像
  • O 1 O 2 连线 O_1O_2连线 O1O2连线基线
  • e 1 , e 2 e_1, e_2 e1,e2 : O 1 O 2 O_1O_2 O1O2 I 1 , I 2 I_1,I_2 I1,I2 的交点,也叫极点
  • 极平面 O 1 , O 2 , P O_1,O_2,P O1,O2,P 所在平面
  • 极线 l 1 , l 2 l_1, l_2 l1,l2

如果没有深度信息,则 O 1 P O_1P O1P 直线上任一点投影都在 p 1 p_1 p1,且他在第二帧图像上的轨迹在 极线 p 2 e 2 p_2e_2 p2e2 上,所以有真确的匹配,就可以推断 P P P 的位置,然后得到相机的运动。

2.1 本质矩阵(对极约束)

推理部分略,详见《视觉SLAM十四讲》第七章7.3节,这里给出结果。
仍参考上图,取两个像素点归一化平面上的点 x 1 , x 2 x_1,x_2 x1,x2
x 1 = K − 1 p 1 , x 2 = K − 1 p 2 x_1=K^{-1}p_1,\qquad\qquad x_2 = K^{-1}p_2 x1=K1p1,x2=K1p2
最终的对极约束 为:
p 2 T K − T t \qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad p_2^TK^{-T}t p2TKTt^ R K − 1 p 1 = 0 RK^{-1}p_1 = 0 RK1p1=0

它的含义是 O 1 , O 2 , P O_1,O_2,P O1O2,P 三点共面。从式中心部分,记本质矩阵 E \boldsymbol E E基础矩阵 F \boldsymbol F F 如下:

E = t \qquad\qquad\qquad\qquad\qquad\qquad\qquad E=t E=t^ R F = K − T E K − 1 x 2 T E x 1 = p 2 T F p 1 = 0 R\qquad\qquad F=K^{-T}EK^{-1}\qquad\qquad x_2^TEx_1=p_2^TFp_1=0 RF=KTEK1x2TEx1=p2TFp1=0

可以看出 E \boldsymbol E E F \boldsymbol F F 只差内参 K K K (已知),所以二者 求一即可。
不妨以 E = t E=t E=t^ R R R来求解。则后续工作如下:

  1. 根据已匹配点对,求出 E \boldsymbol E E F \boldsymbol F F
  2. 根据 E \boldsymbol E E F \boldsymbol F F,求出相机运动 R , t \boldsymbol {R,t} R,t

2.1.1 求解本质矩阵

探究本质矩阵的特点:

    1. 由对极约束 x 2 T E x 1 = 0 x_2^TEx_1=0 x2TEx1=0 , 所以它在不同尺度下等价,左右乘依旧满足约束。又因为 E = t E=t E=t^ R R R, 原本有6个自由度,故去掉尺度,还有5个自由度
    1. E 的内在性质 E的内在性质 E的内在性质 : 它的奇异值必定是 [ δ , δ , 0 ] T [\delta ,\delta, 0]^T [δδ0]T 的形式,非线性的性质。

求解依据:
x 2 T E x 1 = 0 ( 1 ) x_2^TEx_1 = 0 \qquad\qquad\qquad\qquad (1) x2TEx1=0(1)
理论上可以用5对点来求解,但是很麻烦。故用 八点法 求解(由于尺度不变性)。

1.首先考虑一对点(归一化坐标 x 1 , x 2 x_1, x_2 x1,x2 ): 将(1)式展开:
( u 1 , v 1 , 1 ) ( e 1 e 2 e 3 e 4 e 5 e 6 e 7 e 8 e 9 ) ( u 2 v 2 1 ) = 0 ⇓ 将 e 展开 e = [ e 1 , e 2 , e 3 , e 4 , e 5 , e 6 , e 7 , e 8 , e 9 ] ⇓ 展开并重写 [ u 1 u 2 , u 1 v 2 , u 1 , v 1 u 2 , v 1 v 2 , v 1 , u 2 , v 2 , 1 ] ⋅ e = 0 ⇓ 考虑 8 对点的方程组 (u_1, v_1,1)\begin{pmatrix} e_1\quad e_2\quad e_3 \\e_4\quad e_5\quad e_6 \\e_7\quad e_8\quad e_9 \end{pmatrix}\begin{pmatrix} u_2\\v_2\\1 \end{pmatrix}=0 \quad\\\; \\\;\Downarrow 将e展开 \\\;\\\;e=[e_1,e_2,e_3,e_4,e_5,e_6,e_7,e_8,e_9]\\\;\\\; \Downarrow展开并重写\\\;\\\; [u_1u_2,u_1v_2,u_1,v_1u_2,v_1v_2,v_1,u_2,v_2,1]\cdot e = 0 \\\;\\\Downarrow考虑8对点的方程组 (u1,v1,1) e1e2e3e4e5e6e7e8e9 u2v21 =0e展开e=[e1,e2,e3,e4,e5,e6,e7,e8,e9]展开并重写[u1u2,u1v2,u1,v1u2,v1v2,v1,u2,v2,1]e=0考虑8对点的方程组
在这里插入图片描述
至此,本质矩阵的求解结束

2.1.2 恢复相机运动 R , t R,t Rt

  1. E \boldsymbol E E 做SVD分解
    E = U ∑ V T ( U , V 正交阵, ∑ 为奇异矩阵且 = d i a g ( δ , δ , 0 ) ) E=U\sum V_T\qquad\qquad (U,V正交阵,\sum 为奇异矩阵且=diag(\delta,\delta,0)) E=UVT(U,V正交阵,为奇异矩阵且=diag(δ,δ,0))
  2. 求解较为复杂,这里给出结果
    在这里插入图片描述一共存在4组解。如下:
    图源视觉SLAM14讲
    蓝色横线就是相机平面,红色点为投影点。

有(1)满足要求,因为只有这样才符合投影模型,深度才为正。将解出来的解带入验算即可。


2.1.3 本质矩阵调整

5个自由度,用了8个点,上边的方程求解出的 E E E 可能不满足 E E E 的内在性质( ∑ = d i a g ( δ , δ , 0 ) \boldsymbol {\sum = diag(\delta,\delta,0)} =diag(δ,δ,0) ),因此要调整。做法如下:
在做SVD分解时,得到
∑ = d i a g ( δ 1 , δ 2 , δ 3 ) ⇓ 设 δ 1 ≥ δ 2 ≥ δ 3 ,则新的 ∑ 如下 ∑ ′ = d i a g ( δ 1 + δ 2 2 , δ 1 + δ 2 2 , 0 ) ⇓ 带入 S V D 分解式 E = U d i a g ( δ 1 + δ 2 2 , δ 1 + δ 2 2 , 0 ) V T \sum = diag(\delta_1,\delta_2,\delta_3) \\\;\\\Downarrow 设\delta_1\ge\delta_2\ge\delta_3,则新的\sum如下\\\; \\\sum' = diag(\frac{\delta_1+\delta_2}{2}, \frac{\delta_1+\delta_2}{2},0)\\\; \\\Downarrow 带入SVD分解式\\\; \\E=Udiag(\frac{\delta_1+\delta_2}{2}, \frac{\delta_1+\delta_2}{2},0)V^T =diag(δ1,δ2,δ3)δ1δ2δ3,则新的如下=diag(2δ1+δ2,2δ1+δ2,0)带入SVD分解式E=Udiag(2δ1+δ2,2δ1+δ2,0)VT

相当于把求出来的矩阵投影到了 E \boldsymbol E E 的流形上,也可以直接取 ∑ = ( 1 , 1 , 0 ) \sum = (1,1,0) =(1,1,0) (尺度不变性)

2.1.3 遗留问题

  1. E \boldsymbol E E 的尺度不确定性导致了 t \boldsymbol {t} t 的尺度不确定性。(由于 R \boldsymbol R R) 自身带有约束。因此单目SLAM存在初始化: t \boldsymbol t t 的单位为固定尺度1的计算相机运动和特征点;
  2. 单目初始化不能只有纯旋转,必须要有一定的平移: 因为 t \boldsymbol t t 为0,所以 E \boldsymbol E E 最终也为0;
  3. 当点多于8对,此时构成超定方程,我们有两种做法:
  • 3.1. 最小化一个二次型(最小二乘意义下的)
  • 3.2. 随机采样一致性(RANSAC),可以处理有错误匹配的情况,一般用这个。

2.2 单应矩阵(特别提一下)

为什么需要单应矩阵 H H H (Homography)?

  • 当特征点共面,相机纯旋转, F \boldsymbol F F 的自由度少了 t t t ,下降。这就是退化现象。
  • 如果这时仍用八点法求解,多出来的自由度是噪声带来的。
  • 为了避免退化,同时估计基础矩阵 F \boldsymbol F F 和 单应矩阵 H \boldsymbol H H,选择重投影误差小的矩阵作为最终运动估计矩阵。

H H H 假设的所有特征点位于平面上。

详细推导内容见SLAM十四讲7.3.3 。根据法平面做的,求解与 E 和 F E和F EF 相似。只需要4对匹配点就可以算出。

2.3 三角测量(Triangulation)—深度信息

  • 计算深度:回想相机模型那一节,这里的深度就是之前被我们固定为1的 s \boldsymbol s s 。以第一帧图像为坐标原点,由以上对极约束内容有:
    s 1 x 1 = s 2 R x 2 + t ⇓ 分别单独计算,左乘 x 1 的反对称矩阵 s_1x_1 = s_2Rx_2+t \\\; \\\Downarrow 分别单独计算,左乘x_1的反对称矩阵 s1x1=s2Rx2+t分别单独计算,左乘x1的反对称矩阵
    s 1 ( x 1 \qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad s_1(x_1 s1(x1^ ) x 1 = 0 = s 2 ( x 1 )x_1=0=s_2(x_1 )x1=0=s2(x1 ^ ) R x 2 + ( x 1 )\;Rx_2+(x_1 )Rx2+(x1 ^ ) t )t )t

  • 可以直接求得深度 s 1 , s 2 \boldsymbol {s_1,s_2} s1,s2 。但是由于噪声的存在,我们一般是求最小二乘解,而不是零解。同样由于尺度不确定性,我们只知道深度对于t的数量,而不知道具体究竟是多少米。

  • 三角化矛盾: 平移越大三角化越精确,但是视野越短,反之亦然。

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

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

相关文章

【React】搭建React项目

最近自己在尝试搭建react项目,其实react项目搭建没有想象中的那么复杂,我们只需要使用一个命令把React架子搭建好,其他的依赖可以根据具体的需求去安装,比如AntDesignMobile的UI框架,执行npm install antd-mobile --sa…

无涯教程-Lua - 变量声明

变量的名称可以由字母,数字和下划线字符组成。它必须以字母或下划线开头,由于Lua区分大小写,因此大写和小写字母是不同的。 在Lua中,尽管无涯教程没有变量数据类型,但是根据变量的范围有三种类型。 全局变量(Global) …

[Linux]详解环境基础开发工具的使用

[Linux]环境基础开发工具的使用 文章目录 [Linux]环境基础开发工具的使用0. 前言1. Linux 软件包管理器 yumyum介绍yum的使用yum源 2. Linux编辑器-vimvim介绍vim基本模式底行模式下的命令汇总命令模式下的命令汇总vim简单配置 3. Linux编译器gcc/g4. Linux项目自动化构建工具-…

IO进程线程第四天(8.1)opendir,closedir,readdir

作业1&#xff1a; 从终端获取一个文件的路径以及名字。 若该文件是目录文件&#xff0c;则将该文件下的所有文件的属性显示到终端&#xff0c;类似ls -l该文件夹 若该文件不是目录文件&#xff0c;则显示该文件的属性到终端上&#xff0c;类似ls -l这单个文件 #include<…

Linux|ubuntu下运行python

参考&#xff1a;ubuntu系统下切换python版本的方法 文章目录 python版本问题查看ubuntu下的所有python版本通过apt-get install可以安装不同版本python查看python版本号更新update-alternatives替代列表查看update-alternatives下的python版本切换python版本删除python版本 p…

工作记录------单元测试(持续更新)

工作记录------单元测试 之前的工作中从来没有写过单元测试&#xff0c;新入职公司要求写单元测试&#xff0c; 个人觉得&#xff0c;作为程序员单元测试还是必须会写的 于此记录一下首次编写单元测试的过程。 首先引入单元测试相关的依赖 <dependency><groupId>…

分布式开源监控Zabbix实战

Zabbix作为一个分布式开源监控软件&#xff0c;在传统的监控领域有着先天的优势&#xff0c;具备灵活的数据采集、自定义的告警策略、丰富的图表展示以及高可用性和扩展性。本文简要介绍Zabbix的特性、整体架构和工作流程&#xff0c;以及安装部署的过程&#xff0c;并结合实战…

【爬虫逆向案例】某易云音乐(评论)js逆向—— params、encSecKey解密

声明&#xff1a;本文只作学习研究&#xff0c;禁止用于非法用途&#xff0c;否则后果自负&#xff0c;如有侵权&#xff0c;请告知删除&#xff0c;谢谢&#xff01; 【爬虫逆向案例】某易云音乐&#xff08;评论&#xff09;js逆向—— params、encSecKey解密 1、前言2、行动…

EXCEL, 用if({1,0,0} ...) 实现把给定的区域,输出为任意你想要的矩阵,数组区域!

目录 1 原材料&#xff1a;这样的一个区域 工具 if({1,0,0}) 数组公式 1.1 原始数据 1.2 原理 if(0/1,t-value,f-value)---变形--->if({},range1,range2) 1.2.1 if(0/1,t-value,f-value)---变形--->if({},range1,range2) 1.2.2 原理1&#xff1a; if 数组原理&#…

汽车后视镜反射率检测系统

随着社会的快速发展和物质生活的提供&#xff0c;机动车越来越普及&#xff0c;道路行车安全日益重要。为了保障机动车辆和行人的安全&#xff0c;在行车时不断观察后方和两侧的图像尤为重要。机动车后视镜通过反射镜面可以提供在规定视野内后方和两侧的图像&#xff0c;从而提…

【云原生】Kubernetes中deployment是什么?

目录 Deployments 更新 Deployment 回滚 Deployment 缩放 Deployment Deployment 状态 清理策略 金丝雀部署 编写 Deployment 规约 Deployments 一个 Deployment 为 Pod 和 ReplicaSet 提供声明式的更新能力。 你负责描述 Deployment 中的 目标状态&#xff0c;而 De…

Red Hat 安装JDK与IntelliJ IDEA

目录 前言 Red Hat 安装 JDK 1、更新软件包列表 2、安装OpenJDK 3、验证安装 Red Hat 安装IntelliJ IDEA 1、下载 IntelliJ IDEA 2、解压缩 IntelliJ IDEA 安装包 3、移动 IntelliJ IDEA 到安装目录 4、启动 IntelliJ IDEA 前言 YUM是基于Red Hat的Linux发行版的一个…

R语言地理加权回归、主成份分析、判别分析等空间异质性数据分析

在自然和社会科学领域有大量与地理或空间有关的数据&#xff0c;这一类数据一般具有严重的空间异质性&#xff0c;而通常的统计学方法并不能处理空间异质性&#xff0c;因而对此类型的数据无能为力。以地理加权回归为基础的一系列方法&#xff1a;经典地理加权回归&#xff0c;…

Stable Diffusion VAE:改善图像质量的原理、选型与使用指南

VAE Stable Diffusion&#xff08;稳定扩散&#xff09;是一种用于生成模型的算法&#xff0c;结合了变分自编码器&#xff08;Variational Autoencoder&#xff0c;VAE&#xff09;和扩散生成网络&#xff08;Diffusion Generative Network&#xff09;的思想。它通过对变分自…

Maya中polygon和transform区别?

In Autodesk Maya, “polygon” and “transform” are two fundamental types of nodes used to represent different aspects of 3D geometry and the transformation of objects in the scene. Polygon (polyMesh): A polygon node, often referred to as a “polyMesh,” r…

使用Wps减小PDF文件的大小

第一步、打开左上角的文件 第二步、点击打印选项 第三步、点击打印按钮

2023.8.1号论文阅读

文章目录 MCPA: Multi-scale Cross Perceptron Attention Network for 2D Medical Image Segmentation摘要本文方法实验结果 SwinMM: Masked Multi-view with SwinTransformers for 3D Medical Image Segmentation摘要本文方法实验结果 MCPA: Multi-scale Cross Perceptron Att…

Pytorch个人学习记录总结 09

目录 损失函数与反向传播 L1Loss MSELOSS CrossEntropyLoss 损失函数与反向传播 所需的Loss计算函数都在torch.nn的LossFunctions中&#xff0c;官方网址是&#xff1a;torch.nn — PyTorch 2.0 documentation。举例了L1Loss、MSELoss、CrossEntropyLoss。 在这些Loss函数…

linux系统将OpenSSH升级到最高版本

一、背景&#xff1a; 公司安全扫描到主机的OpenSSH安全漏洞&#xff0c;由于是虚拟机只能由自己修复&#xff0c;很多OpenSSH的漏洞厂商都没有提供补丁&#xff0c;只能通过禁用scp或者端口的方式临时解决&#xff0c;但是后面使用就不方便了&#xff0c;而且也不安全&#x…

这所211考数一英二,学硕降分33分,十分罕见!

一、学校及专业介绍 合肥工业大学&#xff08;Hefei University of Technology&#xff09;&#xff0c;简称“合工大”&#xff0c;校本部位于安徽省合肥市&#xff0c;是中华人民共和国教育部直属的全国重点大学&#xff0c;是国家“双一流”建设高校&#xff0c; 国家“211工…