原文首发于微信公众号「3D视觉工坊」——聊聊三维重建-双目立体视觉原理

作首:Tengfei Jiang

https://zhuanlan.zhihu.com/p/81016834

本文已由原作者授权,不得擅自二次转载

前言

三维重建是个跨多学科的应用领域,围绕不同的尺度大小、不同速度要求、不同精度要求、不同硬件成本等要求发展出了各种各样的技术方案。在这个应用领域,充分体现了,没有最好的设备,只有最合适的方案。在本系列文章中,我尝试解释接触过的不同技术方案,如有错误之处,敬请斧正。

双目立体视觉原理

视差 (Disparity) 及 深度计算

人依靠两只眼睛判断深度(物体离眼睛的距离),具体是如何来判断的呢,我们从小到大似乎并未接受过深度计算的训练。视差(Disparity)是解释原理的基本概念之一。我们可以做个简单的实验,将手指置于双目之间,分别开闭左右眼。怎么样,是不是发现手指不在同一个位置?这就是视差。

可以参考上图,当左右相机同时观察三维点时,该点分别投影在左右相机的相平面上,这两个投影点之间的差异就是视差:d=Xleft-Xright。这个公式看起来简单直观,其实有不少未解释清楚的地方,比如这两个x是在同一个坐标系内么,这两个像平面一定是平行摆放的吗,为什么可以直接减?等等。

要解释清楚这些问题,上图还是略简陋,让我们换张图来解释。

图中,P是三维物体的顶点坐标,其和左右相机光心CL、CR的连线与左右相平面的交点即为投影点。注意现在说的所有坐标都是定义在同一个坐标系内,坐标原点与标架已经在图中左下角标识出来了。

现在问题来了,已知,已知d、b、f,求z。这是一个初中几何题,答案很简单:

从公式可以看出,视差 d和深度z成反比关系。视差越大,可以探测的深度越小。b是两个相机光心的距离,又叫基线(baseline),f是相机的焦距。f、b与深度均成正比关系。

立体匹配

从上一节可以看到,如果要计算深度,我们需要知道视差、基线、焦距。另外注意,上文的推导是基于理想模型,比如不考虑相机的畸变,不考虑双相机光轴不平行的情况。

在视差计算之前,我们首先给定了两个投影点。但实际应用中,我们并不知道左右相机中哪两个点是对应点。查找对应点是双目立体视觉中非常核心的步骤,可以毫不夸张地说,大部分的结构光重建方案解决的都是如何准确快速地匹配对应点。在介绍具体方案之前,有些通用的背景知识稍微铺垫一下。

对极几何(Epipolar Geometry)是一个内容非常丰富的范畴(本文不想铺展太多,只是选择几个概念简单描述,详细内容可以参考《计算机视觉中的多视图几何》一书)。对极几何描述的是三维点与两个相机相平面之间的特殊几何关系,我们先看下图的模型。

其中C0、C1为两个相机中心,P为空间中一点,P在C0、C1对应像平面上的投影分别为X0、X1。C0、C1连线与像平面的交点e0、e1称为极点(Epipoles),l0、l1称为极线(Epipolar Lines),C0、C1、P三点组成的平面称为极平面(Epipolar Plane)

这个模型有个有趣的性质。当三维点P沿着方向接近左相机时,我们发现其在左相机上的投影点X0并不会移动,但是其在右相机相平面上的投影点x1发生了变化,其移动轨迹一定是沿着极线l1。反过来,假设我们并不知道P点坐标,只知道X0是其在左相机上的投影,要寻找其在右相机相平面中的投影,则只需要沿着极线l1搜索即可。这个性质使得对应点匹配的搜索空间直接从2维降低到1维。

聪明的同学看到这肯定会问了,没有P点怎么知道极线在哪,这不是因果不分么?事实上极线的位置仅和X0以及相机的内外参有关,和P点位置无关。这就引出了接下来的约束。在对极几何中有个非常著名的约束---对极约束(Epipolar Constraint)形式化地描述了对应点 X0、X1之间的几何关系:

其中F是基础矩阵(Fundamental Matrix)。这个式子是如此简洁,以至于忍不住想要推导一番,推导过程见附录1。

极线矫正 对极约束描述了对应点匹配可沿极线搜索。在实际应用中,两个相机摆放一定是不平行的,因而相平面中的极线大概率是条斜线,这就给搜索过程带来了不便,为了简化过程,还需要引入额外的极线矫正步骤,使得两相机的极线共线且平行于相平面的X 轴。矫正前后的效果如下面两张图所示,应该比较直观。

对应点查找经过上述处理后,要生成视差图,最核心的步骤就是在相平面的同一行上,查找对应点了。查找的方法有多种,大体上可以分成两类。

(1)提取图像特征该类方法可以对每张图像单独进行分析,提取“特征”。这里特征可以有不同的表示方法,如边缘、角点等,也可能来自其他主动投射的结构光信息,如正弦条纹相位值、编码值等,通过在双目图像之间查找相同(相似)特征来确定对应点。

(2)使用相关关系 该类方法假设对应点小领域内有相似的亮度模式,因而可以用两者的相关关系来定位。为了增加额外的亮度变化信息,通常会通过主动光源投射随机散斑这类图案。

具体的结构光重建原理会在后续文章中展开讨论。

参考

附录

对极约束证明:

上述内容,如有侵犯版权,请联系作者,会自行删文。

交流群

欢迎加入我们公众号读者群一起和同行交流,目前有3D视觉深度学习激光SLAM、VSLAM、三维重建、点云后处理、图像处理、手眼标定、自动驾驶、位姿估计等微信群,请扫描下面微信号加群,备注:”研究方向+学校/公司+昵称“,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进去相关微信群。

知识星球

学习3D视觉核心技术,扫描查看详情,3天内无条件退款

圈里有高质量教程资料、可答疑解惑、助你高效解决问题

聊聊三维重建-双目立体视觉原理相关推荐

  1. python双目视觉三维重建代码_双目立体视觉的三维重建方法与流程

    本发明为双目立体视觉的三维重建方法,属于图像处理与机器视觉领域,涉及halcon软件,具体涉及空间场景的三维重建. 背景技术: 三维重建技术作为计算机视觉领域的一个重要分支,在人工智能.虚拟现实.非接 ...

  2. 双目立体视觉数学原理

    双目立体视觉的数学原理 双目立体视觉技术的实现一般可分为:图像获取.摄像机标定.特征提取.图像匹配和三维重建几个步骤.双目立体视觉是基于视差原理,由三角法原理进行三维信息的获取,即由两个摄像机的图像平 ...

  3. 双目视觉焦距_深度相机原理揭秘--双目立体视觉

    深度相机原理揭秘--双目立体视觉 博文来源:http://www.sohu.com/a/203027140_100007727 导读 为什么非得用双目相机才能得到深度? 双目立体视觉深度相机的工作流程 ...

  4. python双目三维重建_OpenCV+OpenGL 双目立体视觉三维重建

    0.绪论 这篇文章主要为了研究双目立体视觉的最终目标--三维重建,系统的介绍了三维重建的整体步骤.双目立体视觉的整体流程包括:图像获取,摄像机标定,特征提取(稠密匹配中这一步可以省略),立体匹配,三维 ...

  5. 双目立体视觉的数学原理

    1.前言戏说 双目立体视觉是基于视差原理,由多幅图像获取物体三维几何信息的方法.在机器视觉系统中,双目视觉一般由双摄像机从不同角度同时获取周围景物的两幅数字图像,或有由单摄像机在不同时刻从不同角度获取 ...

  6. 第一课:深度相机原理揭秘--双目立体视觉

    导读 为什么非得用双目相机才能得到深度? 双目立体视觉深度相机的工作流程 双目立体视觉深度相机详细工作原理 理想双目相机成像模型 极线约束 图像矫正技术 基于滑动窗口的图像匹配 基于能量优化的图像匹配 ...

  7. 双目立体视觉三维重建

    Overview 欢迎访问 持续更新:https://cgabc.xyz/posts/aa4d53ac/ 双目立体视觉的整体流程包括: 图像采集 双目标定 双目矫正 立体匹配 三维重建 1. 图像采集 ...

  8. 双目立体视觉源代码 双目立体视觉匹配程序 双目视觉3d成像(三维重构图像处理) 基于双目视觉的深度计算和三维重建 opencv写的双目视觉摄像机标定和三维重建代码

    双目视觉/双目标定源码/图片集标定匹配三维重建坐标计算OpenCV 1.双目立体视觉源代码(包括标定,匹配,三维重建) 2.双目视觉实验图片集(双目立体视觉中使用的标准实验图,适合初学者进 行实验使用 ...

  9. 【深度相机系列三】深度相机原理揭秘--双目立体视觉

    本文已经首发在个人微信公共号:计算机视觉life(微信号CV_life),欢迎关注! 导读 为什么非得用双目相机才能得到深度? 双目立体视觉深度相机的工作流程 双目立体视觉深度相机详细工作原理 理想双 ...

最新文章

  1. java定义一个类计算圆的半径,C++编程:定义一个圆类要求属性为半径,操作为计算圆的周长和面积...,java编程:定义一个圆类,属性为半径,方法为对输入的半径计...
  2. Oracle海量数据优化-02分区在海量数据库中的应用-更新中
  3. 区块链BaaS云服务(35)亦笔科技ODRChain
  4. 视频:easyhadoop聚会hive和phpHiveAdmin部分
  5. 对lua协程的一点理解
  6. Spring Data JPA 从入门到精通~@Modifying修改查询
  7. HLG 1334 最好的心情[lis 变形]
  8. day17【前台】支付案例
  9. 个人数据常用备份策略
  10. 软件测试流程改进的几点看法
  11. python 答题助手_MillionHerosHelper-超级答题助手
  12. 脉冲定理和人性惯性定律,我想这段时间我处于波峰状态。
  13. linux中下载nali + 配置golang环境
  14. Kubernetes 集群安全机制详解
  15. vivoy85a参数配置_vivo Y85手机详细配置参数和图鉴
  16. ubuntu12.04 快捷键
  17. BLOCK PVSE 230/24-5电源acim-jouanin AJ7003.J.2000温度传感器
  18. CSS篇一一简短介绍下CSS
  19. maven命令的方式
  20. 人脸识别系统(一)环境搭建

热门文章

  1. 细节:js 创建对象的几种模式举例
  2. Java值类型与引用类型的不同
  3. 获得每日,每周,每月的0点和24点的时间戳
  4. 网站统计中的PV(访问量):UV(独立访客):IP(独立IP)的定义与区别
  5. 手动配置linux(centos)的IP地址
  6. 在VMware上快速安装win 2003
  7. 极客新闻——09、如何打造核心骨干团队
  8. 高德渲染网关Go语言重构实践
  9. Arthas 实践——生产环境排查 CPU 飚高问题
  10. 某短视频程序员吐槽:公司要求每天刷短视频的时长和绩效挂钩,这合理吗?网友:那某陌员工要按照奔现次数算绩效吗?...