视觉SLAM理论入门——(7)视觉里程计之特征点法—对极几何

2023-05-16

提取ORB特征后,需要根据点估计相机的运动。根据相机的原理,可以分为下面几种情况:

1、当采用单目相机,只知道2D像素坐标,需要根据两组2D点估计运动,这时用对极几何求解

2、当采用双目相机、RGB-D相机,或者通过其他方法知道距离信息,需要根据两组3D点估计运动,这时用ICP求解

3、如果是一组3D点、一组2D点(也就是得到了一些3D点和它们在相机的投影位置),这时用PnP求解

 

1、对极约束

 

当希望求取两帧图像 I_1, I_2 之间的运动,设第一帧到第二帧的运动为 R,t 。两个相机中心分别为 O_1, O_2 。现在,考虑 I_1 中有一个特征点 p_1 ,它在 I_2 中对应着特征点 p_2 。这两个点是通过特征匹配得到的。如果匹配正确,说明它们确实是同一个空间点在两个成像平面上的投影

为了描述它们之间的几何关系,用到了极平面、极点、基线、极线等概念

极平面: O_1,O_2,P 所在的平面

极点:O_1, O_2 连线与像平面 I_1, I_2 的交点 e_1,e_2

基线:O_1, O_2 连线

极线:极平面与两个像平面 I_1, I_2 之间的相交线

从第一帧的角度上看,射线 \underset{O_1p_1}{\rightarrow} 是某个像素 P 可能出现的空间位置,如果不知道 P 的位置,那么当我们在第二个图像上看时,极线 e_2p_2 是 P 可能出现的投影位置,也是射线 \underset{O_1p_1}{\rightarrow} 在第二个相机中的投影。当我们通过特征点匹配,确定了 p_2 的像素位置,从而能够推断 P 的空间位置以及相机运动

设 P = [X,Y,Z]^Ts_1 p_1 = KPs_2 p_2 = K(RP+t)(R,t描述第一个坐标系到第二个坐标系的运动)

由于 sp 和 p 都位于同一条投影直线上,因此记 sp\simeq p

投影关系改写为 p_1 \simeq KPp_2 \simeq K(RP+t)

将P的归一化坐标 x_1 = K^{-1} p_1 , x_2 = K^{ -1} p_2 代入上式得 x_2 \simeq Rx_1 + t

两边同时左乘 t^ (相当于两侧同时与 t 做外积),t\wedge x_2 \simeq t\wedge Rx_1

两侧同时左乘 x_2^T , x_2^Tt\wedge x_2 \simeq x_2^T t\wedge Rx_1t\wedge x_2 与 t,x_2 均垂直,因此式子左边等于 0 ,从而 x_2^T t\wedge Rx_1 = 0

将 p_1,p_2 代入上式,p^T_2 K^{-T} t\wedge RK^{ -1} p_1= 0

上面两个式子称为对极约束,它的几何意义是 O_1,P,O_2 共面,其中

E = t\wedge R 是本质矩阵

F = K^{-T}EK^{-1} 是基础矩阵

 

对极约束又表示为 x_2^TEx_1 = p_2^T F p_1 = 0

对极约束给出了匹配点对的空间位置关系。相机位姿估计问题变为以下两步:

1、根据像素位置求解 E 或 F (本质矩阵 E 与基础矩阵 F 相差了相机内参 K ,而 K 在SLAM问题中是已知的,因此求解 E 和求解 F 是一样的)

2、根据 E 或 F ,求解 R ,t

 

 

 

2、本质矩阵

本质矩阵是3x3矩阵,具有以下特点:

1、在不同尺度下是等价的。本质矩阵 E 由对极约束定义,对极约束是等式为0的约束,因此对 E 乘以任意非0常数后,对极约束仍然成立

2、本质矩阵的内在性质:由 E = t\wedge R ,本质矩阵 E 的奇异值必定是 [\sigma ,\sigma ,0] ^T 的形式

3、t\wedge R 共有六个自由度,由于尺度等价性,实际上只有五个自由度(线性无关)

 

由于本质矩阵 E 具有五个自由度,因此至少使用 5 对点求解。但是,E 的内在性质是一种非线性性质,在求解线性方程时会带来麻烦,因此,也可以只考虑它的尺度等价性,使用八对点来估计 E (八点法)。八点法只利用了 E 的线性性质,因此可以在线性代数框架下求解

考虑一对匹配点,它们的归一化坐标为:x_1 = [u_1 ,v_1 ,1]^T , x_2 = [u_2 ,v_2 ,1]^T,根据对极约束

把矩阵 E 展开,写成向量的形式:e = [e_1 ,e_2 ,e_3 ,e_4 ,e_5 ,e_ 6 ,e_7 ,e_8 ,e_9 ]^T,那么对极约束可以写成 [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

同理,对于其它点对也有相同的表示。把所有点都放到一个方程中,变成线性方程组 ( u_i ,v_i  表示第 i 个特征点)

线性方程组的系数矩阵由特征点位置构成,大小为 8 × 9。如果八对匹配点组成的矩阵满足秩为 8 的条件,那么 E 的各元素就可由上述方程解得,并且零空间维数为 1, e 构成一条线

根据已经估得的本质矩阵 E,恢复出相机的运动 R,t,这个过程是由奇异值分解(SVD)得到的:E = U\Sigma V^T

其中 U,V 为正交阵,Σ 为奇异值矩阵。根据 E 的内在性质,我们知道  \Sigma = diag(\sigma ,\sigma ,0)

在 SVD 分解中,对于任意一个 E,存在两个可能的 t,R 与它对应:

其中 R_Z^T(-\pi/2) 表示沿 Z 轴旋转 90 度得到的旋转矩阵。同时,由于 −E 和 E 等价,所以对任意一个 t 取负号,也会得到同样的结果。因此,从 E 分解到 t,R 时,一共存在四个可能的解

已知空间点在相机(蓝色线)上的投影(红点),想要求解相机的运动。在保持红点不变的情况下,可以画出四种可能的情况,只有第一种解中,P 在两个相机中都具有正的深度。因此点在两个相机下的深度可以作为正解的判别依据

根据线性方程解出的 E,可能不满足 E 的内在性质——它的奇异值不一定为 σ,σ,0 的形式。这时,在做 SVD 时,会刻意地把 Σ 矩阵调整成上面的样子

对八点法求得的 E 进行 SVD 分解后,会得到奇异值矩阵 \Sigma = diag(\sigma_1,\sigma_2 ,\sigma_3) ,不妨设 \sigma _1 \geq \sigma _2 \geq \sigma _3 ,取

这相当于是把求出来的矩阵投影到了 E 所在的流形上。当然,更简单的做法是将奇异值矩阵取成 diag(1,1 ,0),因为 E 具有尺度等价性,这样做也是合理的

 

 

 

 

3、单应矩阵

单应矩阵 H 通常描述处于共同平面上的一些点。若场景中的特征点都落在同一平面上,可以通过单应性来进行运动估计

在图像 I_1 和 I_2 有一对匹配好的特征点 p_1p_2 。这些特征点落在某平面上。设这个平面满足方程:n^T P + d = 0,即-\frac{n^TP}{d} = 1,则

上式简写为 p_2 = Hp_1,其中 H 就是单应矩阵(3x3)

单应矩阵与旋转、平移以及平面参数有关,求解运动与 本质矩阵E 类似,根据匹配点对计算 H ,然后将其分解,计算旋转和平移。上式展开:

这里的等号是在非零因子下成立的。在实际处理中,通常乘以一个非零因子使得 h 9 = 1。然后根据第三行,去掉这个非零因子,于是有:

整理后得:

一组匹配点对可以构造出三个约束(只有两个是线性无关的),因此自由度为 8 的单应矩阵可以通过 4 对匹配特征点算出(这些特征点不能有三点共线的情况),即求解以下的线性方程组(当 h 9 = 0 时,右侧为零):

以上做法把 H 矩阵看成了向量,通过解该向量的线性方程来恢复 H,又称直接线性变换法

求出单应矩阵以后需要对其进行分解,才可以得到相应的旋转矩阵 R 和平移向量 t。单应矩阵的分解同样会返回四组旋转矩阵与平移向量,并且同时可以计算出它们分别对应的场景点所在平面的法向量

如果已知成像的地图点的深度全为正值(即在相机前方),则又可以排除两组解。最后仅剩两组解,这时需要通过更多的先验信息进行判断

通常可以通过假设已知场景平面的法向量来解决,如场景平面与相机平面平行,那么法向量 n 的理论值为 1^T

 

当特征点共面,或者相机发生纯旋转的时候,基础矩阵的自由度下降,出现退化现象。现实中的数据总包含一些噪声,这时候如果继续使用八点法求解基础矩阵,基础矩阵多余的自由度将会主要由噪声决定。为了能够避免退化现象造成的影响,通常我们会同时估计基础矩阵 F 和单应矩阵H,选择重投影误差比较小的那个作为最终的运动估计矩阵

 

 

4、三角测量

在单目 SLAM 中,仅通过单张图像无法获得像素的深度信息,需要通过三角测量的方法来估计地图点的深度

三角测量是指:通过在两处观察同一个点的夹角,确定该点的距离。

考虑图像 I_1I_2 ,以左图为参考,右图的变换矩阵为 T。相机光心为 O_1O_2 。在 I_1 中有特征点 p_1 ,对应 I_2 中有特征点 p_2 。理论上直线 O_1p_1O_2p_2 在场景中会相交于一点 P,该点即是两个特征点所对应的地图点在三维场景中的位置

然而由于噪声的影响,这两条直线往往无法相交。因此,可以通过最二小乘去求解

按照对极几何中的定义,设 x_1 ,x_2 为两个特征点的归一化坐标,那么它们满足:s_1 x_1 = s_2 Rx_2 + t

通过对极几何,可以求解出 R,t 。而估计深度,也就是求解上式的s_1,s_2

对上式两边左乘 x_1\wedge ,得:s_1x_1\wedge x_1 = 0 = s_2x_1\wedge Rx_2 + x_1\wedge t

通过这个式子可以解出 s_2,进一步可以求出 s_1 。由于估计的 R,t 不一定能准确使上式为0,因此多采用最小二乘法求解

 

 

 

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

视觉SLAM理论入门——(7)视觉里程计之特征点法—对极几何 的相关文章

  • URL中"#" "?" "&"号的作用

    10年9月 xff0c twitter改版 一个显著变化 xff0c 就是URL加入了 符号 比如 xff0c 改版前的用户主页网址为http twitter com username 改版后 xff0c 就变成了http twitter
  • STAR法则的简历应用

    STAR法则 即为Situation Task Action Result的缩写 xff0c 具体含义是 Situation 事情是在什么情况下发生 Task 你是如何明确你的任务的 Action 针对这样的情况分析 xff0c 你采用了什
  • BI商业智能

    关键字 xff1a 商务智能 xff0c 数据仓库 xff0c ETL BI xff08 Business Intelligence即商务智能 xff09 xff0c 百度百科用的解释是 xff0c 它是一套完整的解决方案 xff0c 用来
  • 遗传算法 一个模拟自然进化过程的启发式搜索算法

    关键字 xff1a 遗传算法 遗传算法 xff08 Genetic Algorithm xff09 是一种模拟自然界 自然选择 和 自然遗传 的启发式搜索算法 xff0c 通过模拟自然进化过程搜索最优解的方法 直到1989年 xff0c 实
  • PHP四大基本排序算法

    冒泡排序 思路分析 xff1a 在要排序的一组数中 xff0c 对当前还未排好的序列 xff0c 从前往后对相邻的两个数依次进行比较和调整 xff0c 让较大的数往下沉 xff0c 较小的往上冒 即 xff0c 每当两相邻的数比较后发现它们
  • 设置centos的YUM源为国内阿里云源

    阿里云Linux安装镜像源地址 xff1a http mirrors aliyun com http mirrors aliyun com repo CentOS系统更换软件安装源 第一步 xff1a 备份你的原镜像文件 xff0c 以免出
  • PHP八大设计模式

    PHP命名空间 可以更好地组织代码 xff0c 与Java中的包类似 Test1 php span class php span class hljs preprocessor lt php span span class hljs key
  • GitLab使用手册

    安装Git 安装环境 xff1a windows下载地址 xff1a git官方网站安装包 xff1a 64位安装过程 xff1a 傻瓜式安装至此安装完毕 生成私钥和公钥 ssh span class hljs attribute keyg
  • echarts使用心得

    前言 第一次参加工作 xff0c 公司使用图表很频繁 xff0c 我之前会highcharts xff0c 但是公司基本上都是使用的echarts xff0c 于是自己开始琢磨echarts xff0c 使用起来却颇费了一番工夫 所以就把使
  • JQuery插件之Masked Input

    Masked Input是一个字符输入格式化的jQuery插件 它可让你轻松的实现对各种数据的输入进行格式限制 xff0c 如日期 电话等 Masked Input在IE Firefox Safari和Chrome通过测试 Mask会自动为
  • 关于jQuery的九大使用误区

    jQuery是如此容易使用 xff0c 以至于我们有时候忘记了CSS的存在 我们在使用CSS时 xff0c 几乎不去考虑性能 xff0c 因为它已经是快得不值得再去做什么优化上 的努力 但现实世界中 xff0c JQuery会导致令开发人员
  • echarts主题属性设置

    theme 61 span class hljs comment 全图默认背景 span backgroundColor span class hljs string 39 rgba 0 0 0 0 39 span span class h
  • java keytool证书工具使用小结

    Keytool 是一个Java数据证书的管理工具 Keytool将密钥 xff08 key xff09 和证书 xff08 certificates xff09 存在一个称为keystore的文件中在keystore里 xff0c 包含两种
  • Another app is currently holding the yum lock; waiting for it to exit...

    Another app span class hljs keyword is span currently holding span class hljs keyword the span yum lock waiting span cla
  • Javascript网页打印大全

    目录 普通打印 xff08 整页打 xff09 打印去掉 添加页眉页脚 使用外部控件 方法实现多功能打印 打印背景 普通打印 xff08 整页打 xff09 span class hljs built in window span span
  • centos6.5启动nginx报错

    问题 xff1a nginx emerg socket 80 failed 97 Address family not supported by protocol 解决方案 vim etc nginx conf d default conf
  • echarts和highchart的区别

    echarts 先大体了解一下echarts的历史 xff1a echarts是百度公司前端开发的一个图表库 支持柱状图 饼状图 k线图 map图 热导向图 折线图 主要采用canvas画图 highchart highcharts是国外的
  • vi/vim常用配置和快捷键

    快捷键 命令名功能描述gg将光标移动到文档头部G将光标移动到文档尾部nyy全选文本 xff08 没有全选命令的 xff0c 我的做法就是复制n行 xff0c 只要n大于文本的行数就行 xff09 如何复制文本内容到另一个文件中 使用vim进
  • Cannot resolve module 'child_process'

    ERROR span class hljs keyword in span span class hljs regexp xmlhttprequest span lib XMLHttpRequest js Module not found
  • Cannot resolve module 'fs'

    可能很多人都会遇到这个问题 xff0c 反正我的话已经遇到两次了 xff0c 上一次解决的时候没有记录解决办法 xff0c 这次又遇到了 xff0c 而且国内搜索引擎是搜不到这个问题的解决办法的 xff0c 所以写个博客记录一下吧 xff0

随机推荐

  • 面试题13:机器人的运动范围

    题目描述 地上有一个m行和n列的方格 一个机器人从坐标0 0的格子开始移动 xff0c 每一次只能向左 xff0c 右 xff0c 上 xff0c 下四个方向移动一格 xff0c 但是不能进入行坐标和列坐标的数位之和大于k的格子 例如 xf
  • flex布局知识点Beta

    先看图 xff0c 实现下方列表中的效果 xff0c 名字在左 xff0c 数量在右 xff0c 相对条目居中 html代码 span class hljs tag lt span class hljs title view span sp
  • js如何一次循环删除数组中的多个元素

    思路 xff1a 数组遍历删除一个元素很容易 xff0c 通过splice方法删除对应索引的元素即可 xff0c 但是遍历删除多个元素就复杂了很多 xff0c 首先不能按索引从小到大的顺序删除 xff0c 这样可能会导致索引对应的元素发生变
  • git删除远程分支

    两步删除远程仓库 xff1a git branch r d origin dev 删除远程分支 git push origin dev然后提交到远程 注意 xff1a dev分支前的冒号 不能少
  • nodejs基础篇(一)

    我从2017年开始接触nodejs xff0c 到现在用了一年多了 xff0c 觉得我有必要写点东西出来 xff0c 记录自己的积累的知识体系 xff0c 以便更好的掌握nodejs nodejs专题不是按照严格的学习历程书写 xff0c
  • 滚动到顶部的实现方法

    span class token comment scrollTop animation span span class token keyword export span span class token keyword function
  • 浅谈ES6的Promise对象

    相信凡是写过javascript的童鞋也一定都写过回调方法 xff08 callback xff09 xff0c 简单说回调方法就是将一个方法func2作为参数传入另一个方法func1中 xff0c 当func1执行到某一步或者满足某种条件
  • node版本管理器——nvm

    nvm是管理node版本的一个工具 xff0c 具体介绍不再赘述 xff0c 请到GitHub xff08 https github com creationix nvm xff09 查看 安装 Linux Mac curl o https
  • centos下修改mysql默认端口

    mysql5 6安装 xff1a br wget http repo mysql com mysql community release el7 5 noarch rpm br rpm ivh mysql community release
  • nginx开启gzip压缩

    nginx安装 xff1a yum install y nginx 配置文件默认在 etc nginx nginx conf 打开nginx conf添加 gzip span class hljs function start span c
  • wordpress安装后问题汇总

    问题一 xff1a wordpress写文章界面点击 添加媒体 和 可视化 文本 无反应 解决方法 xff1a 在wp config php中追加 define 34 CONCATENATE SCRIPTS 34 false 问题二 xff
  • ucos ii是怎么实现多任务运行的?很通俗易懂的描述

    问题 xff1a ucos上建立一个任务 xff0c 格式如上图 xff0c 它是一个死循环 xff0c 但如果我建立了五个任务 xff0c 并且五个任务里面没有延时 xff0c 就只是像无操作系统那样写法 xff0c 用死循环让它们一直跑
  • 解决vim中文乱码

    执行 xff1a cd xff5e vim vimrc 将如下文本复制保存退出即可 set fileencodings 61 utf 8 ucs bom gb18030 gbk gb2312 cp936 set termencoding 6
  • nginx开启ssl证书

    修改listen为443 如果你又开启防火墙 xff0c 还需将443端口放开 在server中添加 ssl on ssl session timeout 5m ssl certificate cert 214050429370638 pe
  • 一键安装全局npm模块

    GitHub xff1a https github com flitrue npm install global 简介 当我们使用nvm管理node xff0c 切换node版本时 xff0c 安装在全局的npm包无法共用之前node版本中
  • vscode设置命令行启动

    方法一 xff1a 配置 启动 VS Code打开命令面板 shift 43 ctrl 43 P mac shift 43 cmmand 43 P xff0c 输入 shell command xff0c 找到 Install code c
  • Vue和React的生命周期

    最新的Vue和React生命周期 Vue 生命周期 vue生命周期主要有8个 beforeCreatecreatedbeforeMountmountedbeforeUpdateupdatedbeforeDestroydestroyed Re
  • js实现千位分隔符运算

    方法一 xff1a span class token keyword function span span class token function format span span class token punctuation span
  • 调整浏览器滚动条样式

    我们知道浏览器自带滚动条很丑 xff0c 有时影响整个页面到美观 xff0c 尤其在页面内嵌一个滚动列表 xff0c 显得奇丑无比 xff0c 下面我们根据如下代码调节滚动条样式 span class token punctuation s
  • 视觉SLAM理论入门——(7)视觉里程计之特征点法—对极几何

    提取ORB特征后 xff0c 需要根据点估计相机的运动 根据相机的原理 xff0c 可以分为下面几种情况 xff1a 1 当采用单目相机 xff0c 只知道2D像素坐标 xff0c 需要根据两组2D点估计运动 xff0c 这时用对极几何求解