计算机视觉 08 Two-View Stereo
Two-View Stereo
输入:具有已知摄像机矩阵的stereo对(已校准)
输出:密集深度图
Basic Stereo Matching Algorithm
使用一对校准的相机,我们可以通过以下方式重建 3D:Correspondence + Triangulation
具体流程:对左图中的每一个像素
- 在右侧图像中找到相应的极线
- 检查极线上的所有像素点并选择最佳匹配
- 对匹配点进行三角测量(Triangulate)以获取深度信息
A Simple Stereo System
最简单的情况:极线 = 相应的扫描线
相机的图像平面彼此平行并平行于baseline
相机中心位于同一高度
焦距相同
然后极线沿着图像的水平扫描线落下
The Essential Matrix for Simple Stereo
- Epipolar constraint for simple stereo:
- 对应点的 v 坐标是相同的
A General Stereo System
对于一般的stereo系统,图像平面通常不平行
我们可以使用fundamental matrix来查找homographies,将每个视图投影到与基线平行的公共平面上(stereo校正)
Stereo Image Rectification: A Simple Implementation
计算stereo图像校正的流程如下:
- 从基本矩阵或基本矩阵计算 R1
- 将右侧相机旋转 R1 以对齐两个相机的方向
- 通过 Rrect 旋转两个相机,使图像平面平行于基线,即将原始极点映射到无穷大
- 按 H 缩放两个图像以减少扭曲
计算Rectifying Rotation Matrix(Rrect):
Depth from Disparity(差异的深度)
- 差异与深度成反比
Effect of Baseline on Stereo Results:
- 更长的baseline:精度高误差小,但是难以匹配
- 更小的baseline:更容易匹配,但是精度低误差大
Basic Stereo Matching Algorithm的修正:
- 在处理像素前,如果需要,校正两个stereo图像
- 在右侧图像中找到相应的极线
- 检查极线上的所有像素点并选择最佳匹配
- 对匹配点进行三角测量(Triangulate)以获取深度信息。计算差异x - x’,并将z置为Bf / (x - x’)
Local Stereo Matching(使得局部的利益最大化)
Stereo Matching
沿右侧扫描线滑动窗口并比较两个窗口的内容。不用考虑周围只在扫描线上特征匹配取最大值
忽略暗区,因为 x > x′。下图中右侧不用进行计算,因为有x - x’ > 0的限制
Similarity Metrics
- 考虑两个 K × K 像素窗口,这些像素被展平为矢量 wL 、 wR ∈ RK²。其中K是超参数,需要调整
SSD由于受到明暗影响,效果较差
Local Stereo Matching的流程:
- 选择视差范围 [0, D],D是最大范围
- 对于每个像素,x = (x, y) 计算最佳视差。与深度成反比,d越大depth越小
- 对两个图像执行此操作,并应用左右一致性检查以删除异常值。左找右,右找左,需要一致性
Local Stereo Matching: Half Occlusions(半遮挡)
形成上图中“黑洞”的原因——半遮挡
半遮挡:红色区域在左侧图像中可见,但在右侧图像中不可见
半遮挡会导致输出深度图中出现裂缝或孔洞
Local Stereo Matching: Effect of Window Size
Small window size: more details, more noise
Larger windows size: less details, less noise (smoother results)
Local Stereo Matching: Failure Cases
- 缺乏纹理,匹配失败。左右一致性检验时可以删除或者引入噪音
- 相同的纹理可能导致匹配失败
- 高光,漫反射可能导致匹配失败
Global Stereo Matching
Global Stereo Matching with Non-Local Constraints
local stereo为每个窗口独立查找最佳匹配项
需要非局部约束和全局优化匹配
Non-Local Constraints
唯一性:一个图像中的每个点最多应匹配另一个图像中的一个点。但是在极端情况下可能失效
保序性:相应的点应按相同的顺序显示。大平面有小凸起时可能失效
平滑性:相邻点应具有相似的视差值,即视差应为平滑
Disparity Space Image(视差空间图像)
此图像的每个像素都表示匹配成本作为能量函数
只用在“带”中运算即可,x’ > x为负不用考虑,偏移量大时也不用考虑
将有效值的对角线带重新排列成一个矩形数组(在本例中为 64xN)。被称为视差空间图像 (DSI)
DSI 中的每条路径都是立体匹配(stereo matching),我们希望路径成本最低。即在矩阵条中路径能量相加找最优值
Correspondence Types in the Disparity Space Image(对应类型)
- 斜着走说明匹配上,如果被遮挡,则坐标不变“横竖着走”,说明没有匹配上
如果匹配:添加匹配代价(如果强度一致,则较小)
如果被遮挡:添加不匹配的费用(大额费用)
Stereo Matching with Dynamic Programming
- 问题设置:找到最小路径花费总和c(i,j):其中e(q,p)是每一条边的matching cost
- 核心思路:𝐶(𝑖,𝑗) = min𝑘( e𝑘𝑗 + 𝐶(𝑘,𝑗 − 1))
1 | import numpy as np |
上述算法的复杂度:指数->多项式
优化:扫描网格以计算给定其左上角邻居的每个节点的最佳成本
最佳结构如下:
- 可以利用矩阵 B 通过回溯来恢复路径
Occlusion Filling
使用扫描线中位于其前面的最近有效像素的值填充左侧被遮挡的像素
同样,对于右遮挡,查找右侧的有效像素
Dynamic Programming: Seam Carving for Resizing
- 问题描述:对图片进行压缩会导致图片中的内容变形。处理时应该将不重要的部分删去一些,对视觉影响小的部分,即能量小的部分删去一些。通过最优路径来估计能量大小
- 通过动态规划找到接缝(Seam):
Stereo Matching via Global Optimization
动态规划只考虑了每条扫描线的优化
可以将输出视差图像视为一个整体,形成E函数
- 能量函数可以用graph cuts求解:
Global Optimization with Joint Bilateral Upsampling
- 为了显著提高速度:
- 降低输入图像的采样率
- 估计深度图像
- 对深度图像进行上采样
如何对结果上采样:重复使用原始输入图像中的边缘信息
Deep Learning for Stereo Matching
Unsupervised Learning for Stereo Matching
Activate Stereo
Active Stereo with Structured Light
用打了光的图片作匹配效果更好
将“结构化”光图案投射到对象上:简化对应问题,使用一台相机和一台投影仪
Kinect: Structured Infrared Light
Apple TrueDepth
Laser Scanning
- 通过凹陷程度来推算深度