双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理


双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
前 言 三维重建是个跨多学科的应用领域,围绕不同的尺度大小、不同速度要求、不同精度要求、不同硬件成本等要求发展出了各种各样的技术方案。在这个应用领域,充分体现了,没有最好的设备,只有最合适的方案。在本系列文章中,我尝试解释接触过的不同技术方案,如有错误之处,敬请斧正。
双目立体视觉原理 视差 (Disparity) 及 深度计算
人依靠两只眼睛判断深度(物体离眼睛的距离),具体是如何来判断的呢,我们从小到大似乎并未接受过深度计算的训练。视差(Disparity)是解释原理的基本概念之一。我们可以做个简单的实验,将手指置于双目之间,分别开闭左右眼。怎么样,是不是发现手指不在同一个位置?这就是视差。

双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
可以参考上图,当左右相机同时观察三维点时,该点分别投影在左右相机的相平面上,这两个投影点之间的差异就是视差

双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
这个公式看起来简单直观,其实有不少未解释清楚的地方,比如这两个x是在同一个坐标系内么,这两个像平面一定是平行摆放的吗,为什么可以直接减?等等。
要解释清楚这些问题,上图还是略简陋,让我们换张图来解释。

双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
图中
双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
是三维物体的顶点坐标,其和左右相机光心 双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
的连线与左右相平面的交点 双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
即为投影点。注意现在说的所有坐标都是定义在同一个坐标系内,坐标原点与标架已经在图中左下角标识出来了。 现在问题来了,已知
双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
,已知 双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
,求 双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
。这是一个初中几何题,答案很简单:
双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
从公式可以看出,视差
双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
和深度 双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
成反比关系。视差越大,可以探测的深度越小。 双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
是两个相机光心的距离,又叫基线(baseline), 双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
是相机的焦距。 双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
与深度均成正比关系。 立体匹配
从上一节可以看到,如果要计算深度,我们需要知道视差、基线、焦距。另外注意,上文的推导是基于理想模型,比如不考虑相机的畸变,不考虑双相机光轴不平行的情况。
在视差计算之前,我们首先给定了两个投影点。但实际应用中,我们并不知道左右相机中哪两个点是对应点。查找对应点是双目立体视觉中非常核心的步骤,可以毫不夸张地说,大部分的结构光重建方案解决的都是如何准确快速地匹配对应点。在介绍具体方案之前,有些通用的背景知识稍微铺垫一下。
对极几何(Epipolar Geometry)是一个内容非常丰富的范畴(本文不想铺展太多,只是选择几个概念简单描述,详细内容可以参考《计算机视觉中的多视图几何》一书)。对极几何描述的是三维点与两个相机相平面之间的特殊几何关系,我们先看下图的模型。

双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
其中
双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
为两个相机中心, 双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
为空间中一点, 双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
对应像平面上的投影分别为 双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
连线与像平面的交点 双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
称为 极点(Epipoles)双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
称为 极线(Epipolar Lines)双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
三点组成的平面称为 极平面(Epipolar Plane)。 这个模型有个有趣的性质。当三维点
双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
沿着 双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
方向接近左相机时,我们发现其在左相机上的投影点 双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
并不会移动,但是其在右相机相平面上的投影点 双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
发生了变化,其移动轨迹一定是沿着极线 双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
。反过来,假设我们并不知道 双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
点坐标,只知道 双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
是其在左相机上的投影,要寻找其在右相机相平面中的投影,则只需要沿着极线 双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
搜索即可。这个性质使得对应点匹配的搜索空间直接从2维降低到1维。 聪明的同学看到这肯定会问了,没有
双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
点怎么知道极线在哪,这不是因果不分么?事实上极线的位置仅和 双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
以及相机的内外参有关,和 双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
点位置无关。这就引出了接下来的约束。在对极几何中有个非常著名的约束---对极约束(Epipolar Constraint)形式化地描述了对应点 双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
之间的几何关系:
双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
其中
双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
是基础矩阵(Fundamental Matrix)。这个式子是如此简洁,以至于忍不住想要推导一番,推导过程见附录1。 极线矫正 对极约束描述了对应点匹配可沿极线搜索。在实际应用中,两个相机摆放一定是不平行的,因而相平面中的极线大概率是条斜线,这就给搜索过程带来了不便,为了简化过程,还需要引入额外的极线矫正步骤,使得两相机的极线共线且平行于相平面的
双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
轴。矫正前后的效果如下面两张图所示,应该比较直观。
双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片

双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
详细算法可以参考 这篇教程。
对应点查找 经过上述处理后,要生成视差图,最核心的步骤就是在相平面的同一行上,查找对应点了。查找的方法有多种,大体上可以分成两类。

  • 提取图像特征 该类方法可以对每张图像单独进行分析,提取“特征”。这里特征可以有不同的表示方法,如边缘、角点等,也可能来自其他主动投射的结构光信息,如正弦条纹相位值、编码值等,通过在双目图像之间查找相同(相似)特征来确定对应点。
  • 使用相关关系 该类方法假设对应点小领域内有相似的亮度模式,因而可以用两者的相关关系来定位。为了增加额外的亮度变化信息,通常会通过主动光源投射随机散斑这类图案。
具体的结构光重建原理会在后续文章中展开讨论。
参考
  • https://courses.cs.washington.edu/courses/cse455/09wi/Lects/lect16.pdf
  • http://www.cs.tut.fi/~suominen/SGN-1656-stereo/stereo_instructions.pdf
  • https://blog.csdn.net/Ketal_N/article/details/83744626
  • CS231A: Computer Vision, From 3D Reconstruction to Recognition
  • 计算机视觉中的多视图几何 (豆瓣)
  • https://www.ims.tuwien.ac.at/people/michael-hornacek/downloads/rectification-tutorial.pptx
  • http://www.sci.utah.edu/~gerig/CS6320-S2013/Materials/CS6320-CV-F2012-Rectification.pdf
  • http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/FUSIELLO2/node3.html
附录
  1. 对极约束证明:
极线
双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
经过点 双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
,则 双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
,且 双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
。因而可得 双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
,将其改写成斜对称矩阵形式,可得:
双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
再来,可以假设存在单应矩阵
双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
,满足 双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片
,由此我们可以推导出: 【双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理】
双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
文章图片

    推荐阅读