立体视觉中的对极几何——如何更好更快地寻找对应点
2019.10.21 FesianXu

文章目录

    • @[toc]
  • 前言
  • 什么是立体视觉
  • 对极几何
    • 对极约束
    • 本征矩阵
    • 去掉归一化坐标系的限制,引入基础矩阵
  • Reference

前言

在立体视觉中,我们通过多个摄像机的相互配合,可以获得关于现实生活中物体的一些3D信息,通过这些信息,我们可以对这个物体进行重建,建模等等。而在立体视觉中,对极几何有着非常重要的作用,在本文中,笔者将讨论下立体视觉中的对极几何,如何用对极几何去进行更好更快地寻找不同视图中的对应点。如有谬误,请联系指正。转载请注明出处。

∇\nabla∇ 联系方式:

e-mail: FesianXu@gmail.com

QQ: 973926198

github: https://github.com/FesianXu

知乎专栏: 计算机视觉/计算机图形理论与应用

微信公众号


什么是立体视觉

立体视觉(Stereo Vision)是什么呢?我们可以这样理解:
立体视觉(StereoVision)=寻找相关性(Correspondences)+重建(Reconstruction)立体视觉(Stereo Vision) = 寻找相关性(Correspondences) + 重建(Reconstruction) 立体视觉(StereoVision)=寻找相关性(Correspondences)+重建(Reconstruction)

  • Correspondences: 给定一张图片中的像素PlP_lPl​点,寻找其在另一张图片中的对应点PrP_rPr​。
  • Reconstruction: 给定一组对应点对(Pl,Pr)(P_l, P_r)(Pl​,Pr​),计算其在空间中对应点PPP的3D坐标。

Fig 1.1 立体视觉的寻找对应点和重建。

那么,在本文中,其实我们要讨论的内容就属于如何去更好更快地寻找对应点。抱着这个问题,我们正式地开始讨论对极几何吧。


对极几何

假设我们现在有两张从不同视角拍摄的,关于同一个物体的图片,如Fig 2.1所示,最为朴素的想法就是从一个2D区域中去寻找对应点,这样显然我们的计算复杂度很高,而且还不一定精准,那么我们有没有能够改善这个算法的方案呢?我们能不能对对应点的可能搜索范围进一步缩小呢?答案是可以的。

Fig 2.1 难道我们要从一个2D区域中去寻找对应点?

通过对极几何的约束,我们可以把搜索空间限制在一个直线上,我们将这个直线称之为对极线,显然,这样不仅提供了搜索的效率,还提高了搜索的精确度。如Fig 2.2所示。

Fig 2.2 通过对极几何的约束,我们将搜索空间限制在了对极线上。

这个对极几何那么神奇,那到底是什么原理呢?且听笔者慢慢道来。

对极约束

为了简单分析考虑,我们现在只是假设两台摄像机的情况,假设我们已经对摄像机进行了内外参数的标定[2],也就是说,我们已经知道了摄像机的朝向以及彼此之间的距离,相对位置关系等,同时也知道了内参数,也就是焦距等等。那么我们假设现在这两台摄像机同时对某个现实物体点PPP进行成像,我们有几何关系示意图Fig 2.3。

Fig 2.3 对极几何约束,其中P点是实体3D点,O和O'是焦点

在Fig 2.3中,其中的P=(x,y,z)P = (x,y,z)P=(x,y,z)是实体3D点,而OOO和O′O^{\prime}O′是两个摄像机的焦点(对于焦点,读者不妨看成是一个观察者的视角,也就是你可以想象成你在OOO和O′O^{\prime}O′点观察P点。),而成像平面∏\prod∏和∏′\prod^{\prime}∏′就是我们的成像面,其中面上的ppp和p′p^{\prime}p′是实体点P的成像对应点,我们需要找的对应关系,其实就是(p,p′)(p, p^{\prime})(p,p′)这样的点对。

对于这两个不同的相机坐标系,我们对于这两个成像点有着不同的坐标系表达,让我们分别以各自的焦点为原点,表达这两个点,有:
p=[p1p2f]和p′=[p1′p2′f′](2.1)\mathbf{p} = \left[ \begin{matrix} p_1 \\ p_2 \\ f \\ \end{matrix} \right] 和 \, \, \mathbf{p^{\prime}} = \left[ \begin{matrix} p_1^{\prime} \\ p_2^{\prime} \\ f^{\prime} \\ \end{matrix} \right] \tag{2.1} p=⎣⎡​p1​p2​f​⎦⎤​和p′=⎣⎡​p1′​p2′​f′​⎦⎤​(2.1)
对于Fig 2.3中的其他几何元素,我们分别给予术语,以方便称呼:

  1. 点eee和点e′e^{\prime}e′称之为极点(epipole)
  2. 线lll和l′l^{\prime}l′称之为对极线(epipolar line),其中lll是点p′p^{\prime}p′的对极线,l′l^{\prime}l′是点ppp的对极线。
  3. 焦点之间的连线OO′OO^{\prime}OO′称之为基线(Baseline)
  4. 平面POO′POO^{\prime}POO′称之为对极面(epipolar plane)。

具体的元素位置,我们还能参考图Fig 2.4中的英语标注。

Fig 2.4 对极几何的一些术语。

那么由图Fig 2.3我们其实很容易发现,所谓的对极约束,指的就是,成像平面∏\prod∏上的点ppp,其在∏′\prod^{\prime}∏′的对应点p′p^{\prime}p′必然在其对极线l′l^{\prime}l′上,这个关系可以由三者共面很容易看出来,其证明可参考[3]。也就是说,对于点ppp,如果我们要搜索其在另一个成像平面上的对应点,无需在整个平面上搜索,只需要在对极线上寻找即可了。如图Fig 2.5所示,我们发现这个几何关系其实是很直观的。

Fig 2.5 一系列实体点以及其在两个摄像机成像平面上的成像点。

再如图Fig 2.6所示,这是个实际图像的例子,我们发现我们刚才在几何上的结论在实际中是成立的。

Fig 2.6 b和c上的对极线以及其对应点的位置。

同时,我们要注意到,我们的基线和成像平面的位置是不会改变的(假设不改变摄像机的相对位置的话),那么显然,不管实体点PPP的位置在哪里,所有的对极线都是会经过极点的,如图Fig 2.7所示,其中虚线表示不同的对极面,不管对极面是哪个,都是会经过基线的;相对应的,所有的对极线也是会经过极点的。

Fig 2.7 不同的对极面都会经过基线。

好的,那么我们以上就直觉上讨论了对极约束,那么我们应该怎么用代数的方式去描述这个约束呢?毕竟只有用代数的方式表达,才能进行计算机的编程和实现。为了实现代数化,我们要引入所谓的本征矩阵。我们接下来讨论这个。


本征矩阵

还记得公式(2.1)中,我们曾经对两个对应点ppp和p′p^{\prime}p′进行了坐标表达吗?假设我们现在知道了每台摄像机的内部参数,并且图像坐标已经归一化[4,5],这里所说的归一化指的是假设存在一个焦距为1的面,如Fig 2.8所示,这里假设焦距为单位长度,是为了后面的分析方便而已,我们将会看到,当考虑实际焦距时,其处理略有不同。进行了归一化之后,我们有
p=p^p′=p^′\begin{aligned}\mathbf{p} &= \mathbf{\hat{p}} \\\mathbf{p}^{\prime} &= \mathbf{\hat{p}}^{\prime}\end{aligned} pp′​=p^​=p^​′​
其中p^,p^′\mathbf{\hat{p}}, \mathbf{\hat{p}}^{\prime}p^​,p^​′是图像点的单位坐标向量。

Fig 2.8 相机系统内的物理视网膜平面(也就是实际的成像平面)和归一化成像平面(也就是焦距为1时的成像平面,是假想出来的平面,为了分析方便)。

OK, 不管怎么样,我们继续我们的讨论。我们发现在Fig 2.3中,Op⃗,O′p′⃗\vec{Op}, \vec{O^{\prime}p^{\prime}}Op​,O′p′​和OO′⃗\vec{OO^{\prime}}OO′共面,我们用代数描述就是:
Op⃗⋅[OO′⃗×O′p′⃗]=0(2.2)\vec{Op} \cdot [\vec{OO^{\prime}} \times \vec{O^{\prime}p^{\prime}}] = 0 \tag{2.2} Op​⋅[OO′×O′p′​]=0(2.2)
其中,×\times×表示的是向量叉乘,我们知道空间向量叉乘表示求得其在右手坐标系中的正交向量,如图Fig 2.9所示。

Fig 2.9 叉乘的几何意义。

而式子中的点积为0表示了垂直关系,因此式子(2.2)正确表达了我们的对极约束,我们接下来代入坐标。

考虑在∏′\prod^{\prime}∏′中表示点ppp,通过坐标的平移和旋转可以容易实现,见:
q′=R(p−t)(2.3)\mathbf{q}^{\prime} = \mathbf{R}(\mathbf{p}-\mathbf{t}) \tag{2.3} q′=R(p−t)(2.3)
其中t\mathbf{t}t表示平移向量,R\mathbf{R}R表示旋转矩阵。那么反过来有:
p=RTq′+t=RT(q′+Rt)(2.4)\mathbf{p} = \mathbf{R}^{\mathrm{T}}\mathbf{q}^{\prime}+\mathbf{t} = \mathbf{R}^{\mathrm{T}}(\mathbf{q}^{\prime}+\mathbf{R}\mathbf{t}) \tag{2.4} p=RTq′+t=RT(q′+Rt)(2.4)
令R′=RTR^{\prime} = \mathbf{R}^{\mathrm{T}}R′=RT和s′=−Rts^{\prime} = -\mathbf{R}\mathbf{t}s′=−Rt,我们有(2.4)的简化形式:
p=R′(q′−s′)(2.5)\mathbf{p} = R^{\prime} (\mathbf{q}^{\prime}-s^{\prime}) \tag{2.5} p=R′(q′−s′)(2.5)
考虑公式(2.2),我们发现:
Op⃗=pOO′⃗=tO′p′⃗=p′(2.6)\begin{aligned} \vec{Op} &= \mathbf{p} \\ \vec{OO^{\prime}} &= \mathbf{t} \\ \vec{O^{\prime}p^{\prime}} &= \mathbf{p}^{\prime} \end{aligned} \tag{2.6} Op​OO′O′p′​​=p=t=p′​(2.6)
注意到,因为对于垂直关系而言,平移与否没有影响,我们最终有式子:
p⋅[t×p′]=0(Rp)⋅[t×p′]=0(Rp)T[t×p′]=0pTRT[t×p′]=0pTRT[t]×p′=0(2.7)\begin{aligned}\mathbf{p} \cdot [\mathbf{t} \times \mathbf{p}^{\prime}] &= 0 \\(\mathbf{R} \mathbf{p}) \cdot [\mathbf{t} \times \mathbf{p}^{\prime}] &= 0 \\(\mathbf{R} \mathbf{p})^{\mathrm{T}} [\mathbf{t} \times \mathbf{p}^{\prime}] &= 0 \\\mathbf{p}^{\mathrm{T}} \mathbf{R}^{\mathrm{T}} [\mathbf{t} \times \mathbf{p}^{\prime}] &= 0 \\\mathbf{p}^{\mathrm{T}} \mathbf{R}^{\mathrm{T}}[\mathbf{t}]_{\times} \mathbf{p}^{\prime} &= 0\end{aligned}\tag{2.7} p⋅[t×p′](Rp)⋅[t×p′](Rp)T[t×p′]pTRT[t×p′]pTRT[t]×​p′​=0=0=0=0=0​(2.7)
其中,(2.7)第二行的公式表示在另一个成像平面 ∏′\prod^{\prime}∏′ 表示∏\prod∏上的坐标,最后一行,我们把叉乘转化成矩阵乘法操作[6]。对于一个t=[t1,t2,t3]T\mathbf{t} = [t_1, t_2, t_3]^{\mathrm{T}}t=[t1​,t2​,t3​]T来说,其叉乘乘子的矩阵乘法形式为:
[t]×=[0−t3t2t30−t1−t2t10](2.8)[\mathbf{t}]_{\times} = \left[\begin{matrix}0 & -t_3 & t_2 \\t_3 & 0 & -t_1 \\-t_2 & t_1 & 0 \end{matrix}\right]\tag{2.8} [t]×​=⎣⎡​0t3​−t2​​−t3​0t1​​t2​−t1​0​⎦⎤​(2.8)
如果用E=RT[t]×\mathcal{E} = \mathbf{R}^{\mathrm{T}}[\mathbf{t}]_{\times}E=RT[t]×​,我们有:
(pT)Ep′=0(2.9)(\mathbf{p}^{\mathrm{T}}) \mathcal{E} \mathbf{p}^{\prime} = 0\tag{2.9} (pT)Ep′=0(2.9)
我们把这里的E\mathcal{E}E称之为本征矩阵(Essential matrix)。

我们发现,这里的旋转矩阵R\mathbf{R}R其实是可以通过相机标定进行外参数估计得到的,同样的,t\mathbf{t}t也是如此。假设,我们现在已知了∏\prod∏上的点ppp,我们可以令μp=(pT)E∈R3\mathbf{\mu}_p = (\mathbf{p}^{\mathrm{T}}) \mathcal{E} \in \mathbb{R}^3μp​=(pT)E∈R3,我们知道这个是个常数向量。最终,公式(2.9)可以写成:
μpp′=0(2.10)\mathbf{\mu}_p \mathbf{p}^{\prime} = 0 \tag{2.10} μp​p′=0(2.10)
我们发现(2.10)其实就是一个直线方程了,这个直线方程正是ppp的对极线,我们需要搜索的对应点p′p^{\prime}p′正是在对极线上。


去掉归一化坐标系的限制,引入基础矩阵

我们在本征矩阵那一节考虑的是归一化的坐标系,那么如果在原始的图像坐标系中,我们需要改写成:
p=Kp^p′=K′p^′(2.11)\begin{aligned}\mathbf{p} &= \mathcal{K} \mathbf{\hat{p}} \\\mathbf{p}^{\prime} &= \mathcal{K}^{\prime} \mathbf{\hat{p}}^{\prime}\end{aligned}\tag{2.11} pp′​=Kp^​=K′p^​′​(2.11)
其中,K,K′\mathcal{K}, \mathcal{K}^{\prime}K,K′是3×33 \times 33×3的标定矩阵,p^,p^′\mathbf{\hat{p}}, \mathbf{\hat{p}}^{\prime}p^​,p^​′是图像点的单位坐标向量。那么我们有:
pTFp′=0(2.12)\mathbf{p}^{\mathrm{T}} \mathcal{F} \mathbf{p}^{\prime} = 0\tag{2.12} pTFp′=0(2.12)
其中,矩阵F=K−TEK′−1\mathcal{F} = \mathcal{K}^{-\mathrm{T}} \mathcal{E} {\mathcal{K}^{\prime}}^{-1}F=K−TEK′−1称之为基础矩阵(Fundamental matrix)。

通常来说,无论是基础矩阵还是本征矩阵都可以通过内外参数的标定来求得,特别地,通过足够多的的图像匹配计算,我们同样可以无须采用标定图像,也可以得到这两个矩阵。


Reference

[1]. 电子科技大学自动化学院 杨路 老师 计算机视觉课程课件。

[2]. https://blog.csdn.net/LoseInVain/article/details/102632940

[3]. Hartley R, Zisserman A. Multiple View Geometry in Computer Vision[J]. Kybernetes, 2008, 30(9/10):1865 - 1872.

[4]. http://answers.opencv.org/question/83807/normalized-camera-image-coordinates/

[5]. http://answers.opencv.org/question/83807/normalized-camera-image-coordinates/

[6]. https://en.wikipedia.org/wiki/Cross_product

立体视觉中的对极几何——如何更好更快地寻找对应点相关推荐

  1. [OpenCV实战]49 对极几何与立体视觉初探

    本文主要介绍对极几何(Epipolar Geometry)与立体视觉(Stereo Vision)的相关知识.对极几何简单点来说,其目的就是描述是两幅视图之间的内部对应关系,用来对立体视觉进行建模,实 ...

  2. 16.对极几何——介绍,立体视觉约束,条件_1

    目录 介绍 立体视觉约束 条件 介绍 欢迎回到Computer Vision.这将成为关于立体系列的第二部.特别是,我们将专注于所谓的对极几何(epipolar geometry).我们上次说如果我们 ...

  3. 《计算机双目立体视觉》学习笔记:对极几何

    由双目立体视觉系统获得的来自同一场景的两幅图像之间存在着一定的约束关系,也就是说,当我们用两个相机在不同的位置拍摄同一个场景或者物体时,如果两张照片中的景物有重叠的部分,那么这两张照片之间就存在一定的 ...

  4. Planar Homography (共面点成像) Epipolar Geometry(对极几何)

    转载:http://blog.csdn.NET/yvonnezju/article/details/40982192 这一篇,要搞清楚两个概念,Planar Homography (共面点成像)&am ...

  5. 计算机视觉基础——对极几何(Epipolar Geometry)

    先思考一个问题:用两个相机在不同的位置拍摄同一物体,如果两张照片中的景物有重叠的部分,我们有理由相信,这两张照片之间存在一定的对应关系,本节的任务就是如何描述它们之间的对应关系,描述工具是对极几何 , ...

  6. OpenCV系列之对极几何 | 五十一

    目标 在本节中 我们将学习多视图几何的基础知识 我们将了解什么是极点,极线,极线约束等 基础概念 当我们使用针孔相机拍摄图像时,我们失去了重要信息,即图像深度. 或者图像中的每个点距相机多远,因为它是 ...

  7. OpenCV中的对极几何和对极约束

    OpenCV中的对极几何和对极约束 1. 原理 参考 这篇博客将学习多视图几何的基础知识,如什么是对极.对极线.对极约束等. 1. 原理 当使用针孔相机拍摄图像时会丢失一个重要的信息,即图像的深度.或 ...

  8. 基于图像的三维模型重建——相机模型与对极几何

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者:梦寐mayshine https://zhuanlan.zhihu.com/p/12968108 ...

  9. python 几何_OpenCV-Python系列之对极几何理论

    在我们使用针孔相机时,我们会丢失大量重要的信息,比如说图像的深度,或者说图像上的点和摄像机的距离,因这是一个从 3D 到 2D 的转换.因此一 个重要的问题就产生了,使用这样的摄像机我们能否计算除深度 ...

最新文章

  1. [LeetCode]Longest Palindromic Substring题解(动态规划)
  2. 火神山医院紧急招募IT运维志愿者需求
  3. tyvj1068 STR
  4. Codeforces 913 二进制背包(柠檬水) 暴力贪心特殊背包(选题)
  5. python连接数据库并编写调用函数_Python使用pyodbc访问数据库操作方法详解
  6. [转载]MVVM、MVVMLight、MVVMLight Toolkit之我见
  7. c语言字符串型函数是,C语言字符/字符串相关函数收藏大全
  8. python的设计哲学是优雅明确简单_Python简单教程
  9. mac中的csv文件到windows平台乱码的解决办法
  10. 使用shell编写九九乘法表,mysql分库备份
  11. 逆水寒服务器维护公告,逆水寒1月3日更新了什么 逆水寒1月3日更新维护公告
  12. android 消息循环滚动条,Android 电池电量进度条,上下滚动图片的进度条(battery)...
  13. ubuntu21.04美化使用
  14. 进程调度:时间片轮转调度算法
  15. 《MobileNetV2: Inverted Residuals and Linear Bottlenecks》
  16. 生成长微博(文转图)方法
  17. 发那科2021参数_发那科参数
  18. 520特别企划 | Z世代进入婚恋市场,婚恋交友行业会有什么变化?​
  19. 沈阳理工大学计算机考研资料汇总
  20. granfana密码重置

热门文章

  1. ArcView GIS 应用与开发技术(4)-地图投影
  2. 「可信计算」与软件行为学
  3. 你会的还只有初级安卓工程师的技术吗?论程序员成长的正确姿势
  4. 加州旅馆 Hotel California (The Eagles)
  5. Aspose.OCR for Java Crack by Xacker
  6. 怎么把PDF转网页HTML?建议收藏这些方法
  7. 遗传算法matlab优化实例,用遗传算法优化BP神经网络的Matlab编程实例
  8. 提醒事项 android,每日提醒 Pro-提醒事项、时间管理待办清单
  9. NOAA气象数据整理-各站点年月均降水量(2000-2022年)
  10. 电脑进入pe时蓝屏_电脑进入pe时出现蓝屏0x000000a5应该如何解决?