自从小白向师兄学习了李群李代数和相机成像模型的基本原理后,感觉书上的内容没那么难了,公式推导也能推得动了,感觉进步神速,不过最近小白在学习对极几何,貌似又遇到了麻烦。。。

小白:师兄,对极几何这块你觉得重要吗?
师兄:当然重要啦,这个是多视角立体视觉的核心啊

小白:那师兄一定得帮帮我讲清楚啊,最近在看书上这部分内容,感觉很难理解呢!
师兄:哪里不理解?书上公式推导的挺详细了都

小白:这么说吧,公式推导我也能大概看懂,但总觉得不知道为啥这么推导,这样推导的物理意义是什么?
师兄:哦哦,明白啦,就是不能转化为直观的理解方式吧

小白:是的,只能被动接受推导结果,但不能理解背后的原理,这种感觉好差。。
师兄:嗯,那我想想,怎么给你讲。。。说实话,你这个问题挺有意义的

小白:太好啦!开讲吧师兄,小板凳我都搬好啦,瓜子花生都准备好啦

对极几何基本概念
师兄:好。那我就从几何意义的角度来推导一下对极几何中的对极约束吧。先看下面这个图,很熟悉吧,对极约束中很常见的图。它表示的是一个运动的相机在两个不同位置的成像,其中:

左右两个平行四边形分别是相机在不同位置的成像平面
C0, C1分别是两个位置中相机的光心,也就是针孔相机模型中的针孔
P是空间中的一个三维点,p0, p1分别是P点在不同成像平面上对应的像素点

小白:嗯,这个图见到很多次了,不过一直理解的不透彻
师兄:你看上面左侧的图,如果将点P沿着C0-p0所在的直线移动,你会发现P在左边相机的成像一直不变,都是p0,这时候P在右边相机的成像点p1是一直在变化的

小白:对,好像是沿着右边那条红色的线滑动
师兄:嗯,你看C0-C1-P-p0-p1他们都是在同一个平面上的,你可以想象C0-C1-P组成的平面是一个三角尺,它所在的平面称之为极平面(epipolar plane),它像一把锋利的刀,切割了左右两个成像平面

小白:哇塞,这样感觉直观多了
师兄:嗯,其中和成像平面相交的直线称之为极线(epipolar line),两个光心C0, C1和成像平面的交点叫做极点(epipole)。

小白:师兄,好多新的术语啊,都要记吗?
师兄:不用死记,知道是哪个就行了。我们重点来说说极平面,你看下面这个图,C0-C1-P-p0-p1他们是不是都是在极平面上?

小白:嗯,是的,它们都是共面的。

不推公式,如何理解对极约束?
师兄:还记得我们在《从零开始一起学习SLAM | 为什么要用齐次坐标?》里讲的叉乘的定义吗?两个向量的叉乘结果是一个同时垂直于这两个向量的向量。
小白:记得呢,叉乘只在三维空间中有定义,比如两个向量 a和b 的叉乘写作 a x b,它是与向量 a, b都垂直的向量,其方向通过右手定则决定。

师兄:对,除了叉乘,还有点乘,a点乘b的定义是
a * b = ||a||* ||b|| *cos(θ)
因此如果两个互相垂直的向量点乘,cos(θ) = 0,点乘结果也为0。
小白:师兄,这些我都记得呢!可是怎么突然说这个呢,和对极几何有什么关系吗?

师兄:当然有关系!刚刚你说了点乘和叉乘的特点,现在我们把极平面中C0-C1-p0-p1单拎出来,看下面的图

我们能够得到下面的 结论1:

你自己说说为什么这个等式成立?
小白:我看看哈,额,根据叉乘的定义

的结果是一个同时垂直于它们的向量,也就是说垂直于C0-C1-p0-p1组成的极平面,因此这个叉乘的结果再点乘

结果就是0了。是吧,师兄?
师兄:完全正确,用到的都是我们前面刚刚讲过的基础知识~
小白:可是,师兄,叉乘不是仅在三维空间中有定义吗?我们这里的p0, p1都是图像上的二维点啊

师兄:这个问题问的好!确实如你所说,p0, p1都是图像上的二维点,不过,这里我们会把它变成三维的方向向量来考虑
小白:啥是方向向量啊?

师兄:就是我们只考虑它的方向,而不考虑它的起点或终点的向量。我们假设一个归一化的图像平面,该平面上焦距f =1 ,因此我们可以定义在以C0为原点的坐标系下

而在以C1为原点的坐标系下

小白:这样定义可以吗?
师兄:可以的,事实上,你在C0-C1-p0-p1组成的极平面上,保证

的方向不变,在极平面上随便移动,结论1中等式都成立。同样的道理,在极平面上,保证

方向不变,在极平面上随便移动,结论1中等式仍然都成立。
小白:确实是这样,师兄,下一步怎么办?好像p0, p1不在同一个参考坐标系里?

师兄:是的,前面说过,p0在以C0为原点的参考坐标系,p1在以C1为原点的参考坐标系,所以我们还是需要转换坐标系。这里我们把所有点的坐标都转换到以C0为原点的坐标系。前面说过这些向量都是方向向量和向量起始位置无关,所以这里坐标系变换只考虑旋转就可以。我们记 R 为从C1坐标系到C0坐标系的旋转矩阵
小白:那么 Rp1 就是p1 在以C0为原点的C0坐标系了
师兄:对的~现在再看看结论1

最左边向量C0-p0就可以用p0表示,向量C0-C1就是光心C1相对于C0的平移,我们记为t, 向量C1-p1根据前面的讨论,可以用 Rp1 来表示,那么结论1可以表示为以下的结论2:

这个式子是根据对极几何得到的,我们称之为对极约束。
小白:哇塞,师兄,原来对极约束也可以这样得到啊!我现在能完全理解啦!

如何得到极线方程?
师兄:对,这就是对极约束最直观的解释,一般把中间的部分拿出来,像下面这样,记为本质矩阵或本征矩阵(Essential Matrix)。

然后我们就得到了如下的结论3:

小白:厉害了师兄,这下彻底明白啦,不过之前提到的极线什么的好像也没说怎么求啊?
师兄:其实根据上面结论3就可以求出极线方程啦!

小白:啊,怎么求极线方程?
师兄:还记得我们在《从零开始一起学习SLAM | 为什么要用齐次坐标?》里讲过的点p在直线l上的充分必要条件就是 直线l 的系数与p的齐次坐标p’的内积为0

小白:记得呢!那节课的习题我都认真做了,所以印象深刻!
师兄:不错!那结论3我们就可以把Ep1看做是直线的方程,p0看做是直线上的点,也就是说Ep1就是以C0为原点坐标系中的极线了。如下图中红色线条所示,就是极线啦,它的方程是E*p1。

小白:原来如此,看来以前的基础很重要啊!哪里都能用上。谢谢师兄,今天没有推导公式,我竟然能够得到极线约束的式子,太神奇了,而且印象很深刻!

师兄:嗯,相信以后你肯定不会忘记啦!
小白:师兄,我们去吃大餐庆祝一下吧!
师兄:走起~

师兄:等下,今天的作业还没留呢!
小白:(我晕,师兄记性真好。。)

作业
作业1:
证明:对三维列向量下面等式恒成立。其中等式左边 X 表示叉乘,等式右边上三角符号表示反对称矩阵。

作业2:
题目:现有一个运动着的相机拍摄的连续两张图片,其中特征点匹配部分已经完成。请根据两帧图像对应的匹配点计算基础矩阵,并利用该矩阵绘制出前10个特征点对应的极线。
参考结果是这样的:

师兄提醒:关注“计算机视觉life”微信公众号,菜单栏回复“几何”,就能下载代码框架啦!

原文链接:从零开始一起学习SLAM | 不推公式,如何真正理解对极约束?
相关阅读
从零开始一起学习SLAM | 为什么要学SLAM?
从零开始一起学习SLAM | 学习SLAM到底需要学什么?
从零开始一起学习SLAM | SLAM有什么用?
从零开始一起学习SLAM | C++新特性要不要学?
从零开始一起学习SLAM | 为什么要用齐次坐标?
从零开始一起学习SLAM | 三维空间刚体的旋转
从零开始一起学习SLAM | 为啥需要李群与李代数?
从零开始一起学习SLAM | 相机成像模型
零基础小白,如何入门计算机视觉?

---------------------
作者:electech6
来源:CSDN
原文:https://blog.csdn.net/electech6/article/details/83818218
版权声明:本文为博主原创文章,转载请附上博文链接!

从零开始一起学习SLAM | 不推公式,如何真正理解对极约束?的更多相关文章

  1. 从零开始一起学习SLAM | 掌握g2o边的代码套路

    点"计算机视觉life"关注,置顶更快接收消息! 小白:师兄,g2o框架<从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码>,以及顶点<从零开始 ...

  2. 从零开始一起学习SLAM | 掌握g2o顶点编程套路

    点"计算机视觉life"关注,置顶更快接收消息! ## 小白:师兄,上一次将的g2o框架<从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码>真的很清晰 ...

  3. 从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码

    首发于公众号:计算机视觉life 旗下知识星球「从零开始学习SLAM」 这可能是最清晰讲解g2o代码框架的文章 理解图优化,一步步带你看懂g2o框架 小白:师兄师兄,最近我在看SLAM的优化算法,有种 ...

  4. 从零开始一起学习SLAM | 点云平滑法线估计

    点击公众号"计算机视觉life"关注,置顶星标更快接收消息! 本文编程练习框架及数据获取方法见文末获取方式 菜单栏点击"知识星球"查看「从零开始学习SLAM」一 ...

  5. 从零开始一起学习SLAM | 给点云加个滤网

    对VSLAM和三维重建感兴趣的在计算机视觉life"公众号菜单栏回复"三维视觉"进交流群. 小白:师兄,上次你讲了点云拼接后,我回去费了不少时间研究,终于得到了和你给的参 ...

  6. 从零开始一起学习SLAM | 你好,点云

    本文提纲 先热热身点云是啥你知道点云优缺点吗?点云库PCL:开发者的福音PCL安装指北炒鸡简单的PCL实践留个作业再走先热热身 小白:hi,师兄,好久不见师兄:师妹好,上周单应矩阵作业做了吗?小白:嗯 ...

  7. 从零开始一起学习SLAM | 神奇的单应矩阵

    小白最近在看文献时总是碰到一个奇怪的词叫“homography matrix”,查看了翻译,一般都称作“单应矩阵”,更迷糊了.正所谓:“每个字都认识,连在一块却不认识”就是小白的内心独白.查了一下书上 ...

  8. 从零开始一起学习SLAM | 用四元数插值来对齐IMU和图像帧

    视觉 Vs. IMU 小白:师兄,好久没见到你了啊,我最近在看IMU(Inertial Measurement Unit,惯性导航单元)相关的东西,正好有问题求助啊 师兄:又遇到啥问题啦? 小白:是这 ...

  9. 从零开始一起学习SLAM | 相机成像模型

    上一篇文章<从零开始一起学习SLAM | 为啥需要李群与李代数?>以小白和师兄的对话展开,受到了很多读者的好评.本文继续采用对话的方式来学习一下相机成像模型,这个是SLAM中极其重要的内容 ...

随机推荐

  1. Sticks POJ - 1011 少林神棍 dfs四次剪枝

    http://poj.org/problem?id=1011 题意:若干根棍子被截成小段的木棒,现在给你这些木棒,问最短可以拼出的棍子长度. 题解:搜索,dfs(r,m) 二个参数分别代表还剩r个木棒 ...

  2. The Structure of the Java Virtual Machine Java虚拟机结构 虚拟机内存模型

    小结: 1.实现一台Java虚拟机,只需正确读取class文件中的每一条字节码指令且能正确执行这些指令所蕴含的操作. 2.设计者决定:运行时数据区的内存如何布局,选择哪种垃圾收集算法,是否对虚拟机字节 ...

  3. 2016年蓝桥杯省赛A组c++第4题(算法填空)

    /* 排序在各种场合经常被用到. 快速排序是十分常用的高效率的算法. 其思想是:先选一个“标尺”, 用它把整个队列过一遍筛子, 以保证:其左边的元素都不大于它,其右边的元素都不小于它. 这样,排序问题 ...

  4. Python创建第一个django应用

    在helloworld工程的基础上,我们准备创建第一个基于web的django应用,把这个应用名字命名为Guest   1.首先,是如何创建这个应用包,当然第一选择我们可以进入到cmd中,执行如下命令 ...

  5. 【PyQt5-Qt Designer】简易的数字键盘输入+简易计算器

    参考如下键盘格式写了一个键盘输入,目前还不能进行运算,后期完善... 效果如下: 完整代码: from PyQt5.QtWidgets import (QApplication,QWidget,QPu ...

  6. sqlite数据导入mysql

    sqlite导出数据 1.首先将sqlite数据库中的数据库格式由db或者db3等转为.sql格式,方法如下: 首先是不修改路径的情况下,在命令行下(方法一): sqlite3 database_na ...

  7. 使用poi读写excel文件

    使用poi库测试了一下读取excel文件,效果不错,跟大家分享一下. 第一列是数值型,第二列是字符型,代码如下: package poi; import java.io.FileInputStream ...

  8. nginx 、springMvc(非分布式)相应的限流、消峰

    互联网服务赖以生存的根本是流量, 产品和运营会经常通过各种方式来为应用倒流,比如淘宝的双十一等,如何让系统在处理高并发的同时还是保证自身系统的稳定, 通常在最短时间内提高并发的做法就是加机器, 但是如 ...

  9. 前端用Json传输数据给后台,用postman测试

    postman发送json格式的post请求   在地址栏里输入请求url:http://127.0.0.1:8081/getmoney 选择“POST”方式, 在“headers”添加key:Con ...

  10. 【Linux】测试环境如何搭建?

    [Linux]测试环境如何搭建? (该文档所在我的百度网盘位置: ) 通常面试会问到会不会搭建测试环境?到底啥是测试环境搭建呢,其实测试环境没有想像的那么高大上,弄个 tomcat,把测试的 war ...