zoukankan      html  css  js  c++  java
  • 对极约束、本质矩阵(E)、基础矩阵(F)

    尊重别人的劳动成果就是对自己的尊重——声明至上:转载来源:https://www.cnblogs.com/CV-life/p/10053486.html

    从零开始一起学习SLAM | 不推公式,如何真正理解对极约束?

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

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

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

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

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

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

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

    左右两个平行四边形分别是相机在不同位置的成像平面
    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。再延伸一下吧,P0 P1 为相机坐标系下的关系,如果将相机坐标系下的关系转化到像素坐标系,这时候将这里的外参矩阵

    [K = left[ {egin{array}{*{20}{c}}
    {{f_x}}&0&{{c_x}}\
    0&{{f_y}}&{{c_y}}\
    0&0&1
    end{array}} ight]]

    考虑进去,假设P0 P1 对应的像素坐标为

    那么

     P1 同理,这样就有结论4:

     这就是带内参的对极约束形式。其中

     称为基础矩阵。进一步化简为:

     对极约束最终的目的是根据像素匹配点求出E或F然后求出R和t,确定相机位姿。

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

  • 相关阅读:
    使用 gpg 加密文件
    CodeIgniter-Lottery
    使用phpize安装php扩展
    myWaterfall
    一台电脑上的git同时使用两个github账户
    移动端上传照片 预览+Draw on Canvas's Demo(解决 iOS 等设备照片旋转 90 度的 bug)
    移动端禁止页面下滑
    移动端用js与jquery实时监听输入框值的改动
    不管人生怎么走,都需要实时回头看看
    Shader 入门笔记(二) CPU和GPU之间的通信,渲染流水线
  • 原文地址:https://www.cnblogs.com/fuzhuoxin/p/12677986.html
Copyright © 2011-2022 走看看