Multi-View Stereo

  • 和Two-View Stereo的区别:多张图片重建三维而非两张对应的图片

  • 输入:使用校准相机拍摄同一物体或场景的多张图像

    1. 任意数量的图像
    2. 任意摄像机位置(摄像机网络或视频)
    3. 通常校准具有SFM或特殊设备的相机
  • 输出:计算相应 3D 形状的表示。不同于两相机的单视角深度问题,要求重建稠密的3D表达

    1. 体素表达:通过0,1控制显示
    2. 三角网络表达
    3. 点云表达
      image.png

image.png

  • 核心思想:多图片的一致性,稠密的重建要求稠密的一致性

image.png

  • 找一个参考图,衡量像素块的相似程度,构建函数图像找到误差最小的进行重建,其中,参考图在其他相机中的对应点都在极线上

image.png

Why Multi-View Stereo?(为什么需要多个视角)

  • 对象表面上的不同点在某些相机子集中将更加清晰可见。如果视角不够则可能出现遮挡,倾斜的情况从而导致重建出的3D物体不完整

image.png

  • 多视角可以减小误差使得相交区域更小从而形成更强的约束

MVS

image.png

Visual Hull based MVS(基于体素)

  • 核心思想:在多个(3个)视角进行拍摄,重建轮廓线:

    1. 有像素的部分记为1
    2. 没有像素的部分记为0
    3. 然后投影至3D
    4. 求交进行重建
  • 如下图所示,三个相机进行拍摄,货色部分为物体的投影,然后投影到3D进行求交,重建

image.png

Plane-Sweep Stereo(基于体素)

  • 核心思想:
    1. 首先设位于中间的相机为reference相机,设若干深度值,将图像映到不同深度的平面上
    2. 对于两侧的相机应用homography变换映射到不同的深度平面上
    3. 对于不同深度的每一个像素进行三图像的叠加,计算体素的颜色方差D
    4. D越小,一致性越好,选择这个深度作为所求

image.png

Depth Map based MVS

  • 流程:(相机可以未经校准)
    1. 使用相邻视图计算深度图
    2. 将深度图合并到一个volume中。两两计算深度,投影形成点云,找重叠大的
    3. 从volume中提取 3D 曲面,提取连续曲面

image.png

Compute Depth Maps(如何挑选邻域计算深度)

  • 相邻视图之间的遮挡效果很小。因此选定参考图片时,选相邻图片来计算深度

  • 使用匹配分数查找每个像素的最佳匹配,而无需进行强局部正则化;或直接使用双视图立体方法

image.png

Effect of Early Local Regularization

  • 不要过早的进行局部约束,对缺失部分进行平滑约束后于真实值相差过多,加权平均后偏离实际值很多

  • 应该先完成拼接后进行优化

image.png

Patch-based MVS

  • 稠密的重建需要稠密的一致性

  • 核心思想:基于patch的重建 + 迭代扩展和过滤

  • 一个块一个块的找一致性,重建图像块,迭代,对初始重建拓展,最后将不合理的过滤

  • 流程:

    1. Feature detection:Harris corner; DoG
    2. Feature matching
    3. Patch expansion and filtering

image.png

What is a Patch

  • A patch consists of:

    1. Position (x, y, z)(中心位置)
    2. Normal (nx, ny, nz)(法向方向)
    3. Visible images V(p)(可见度0,1)
    4. Extent (radius)(半径,覆盖范围)
  • Patch:切线平面近似

  • 设置范围,使 p 在 V(p) 中大约为 9x9 像素

image.png

Why Patches

  • 容易转化为其他的3D表达,容易添加约束

  • 可以灵活的表达物体和场景

Photo Consistency

  • 优化patch需要误差函数,而误差函数基于一致性N(I,J,p),其中I,J是图片,p是patch

  • Photo-consistency N(I, J, p) of p between two images I and J:首先将照片I渲染到图像中,颜色为Ixy。然后将图片J渲染到图像中,颜色为Jxy

image.png

  • 多个图像Muti-View的N函数叠加得到优化函数N(p),N(p)与c(p)和n(p)相关

image.png

Reconstruct Patch p

  • 给定初始估计:Position c(p)、Normal n(p)、Visible images V(p)

  • 通过如下公式优化c(p),n(p):

image.png

  • 优化position c(p):约束patch在法向量上前后移动,在法向量线上计算argmaxN

  • 优化normal n(p):约束patch在固定position上左右旋转,找到argmaxN(p)

  • 优化V(p):如果投影后覆盖不足,就置为0。启发式更新V(p)

    1. 图像间两两计算N
      image.png
    2. 依次假设某图像为ref,计算与该图像相关的Nsum,得到一致性
      image.png
    3. 将patch绑定到Nsum最大的image中,记为ref_image
    4. 考察其他图片与ref_image的N,如果大于设定的阈值则V(p)=1,否则置为0
      image.png
      image.png

Verify a Patch

  • 为什么要再次验证:

    1. 纹理可能会意外匹配
    2. 光一致性必须相当高才具有置信度
  • 验证的流程:

    1. 在V(p)中必须保持很高的一致性,N足够大
    2. V(p) ≥ 3,至少有三张照片可见
  • 满足上述条件的patch保留,否则删去

Feature Detection

  • 在局部用Harris corner detector进行角点检测,使用DoG检测blobs

Feature matching

Initial Feature Matching

  • 先用triangulation得到c(p),然后用极点几何进行热证匹配,对应点一定在极线上,因此可以沿着极线找到最佳匹配。同时将image1,2加入到v(p)中

image.png

  • 渲染后看image3是否可见,设置阈值和N进行比较

image.png

  • 然后进行优化:

image.png

  • 然后检验是否保留,验证并更新v(p)

image.png

  • 最后将保留的patch标记,代表已经重建。重复上述过程

Patch Expansion

  • 首先先得到初始的patch,然后对每个patch进行循环:

  • 如果一个patch没有被重建,但是邻居都已经被重建,这时候什么都不做

image.png

  • 如果找到patch,其邻居没有被重建,那么就用这个patch初始化邻居进行expansion

image.png

  • 先用p重建q,然后再对q和邻居的patch进行调整,最后进行验证

image.png

  • 迭代流程:
    1. 先通过特征检测和匹配选出置信度高的patch
    2. 然后用这些置信度高的patch更新扩展邻居空patch

Patch Filtering

image.png

summary of Patch-based MVS

  • 优点:

    1. 灵活,用patch
    2. 容易抽取出3D网格
    3. 可以当成黑盒
    4. 对物体和场景都是高效的
  • 缺点:

    1. 严重依赖一致性N函数
    2. 容易受到光照,阴影的影响
    3. 运行时间长

Towards Internet-Scale Multi-View Stereo

  • 采用分而治之的思想,运用聚类先将摄像机分成小块,在小块中使用MVS

image.png

COLMAP MVS

Deep Learning for MVS

image.png

Neural Radiance Field

  • 输入输出和MVS基本相同。输入不同视角下的多张图片,先用SFM估计相机参数变为已知,然后优化表达3D

image.png

Volume Rendering(体渲染)

  • 只吸收的体渲染

  • 只发光的体渲染

Volume Rendering: Absorption Only

1.jpg

2.jpg

3.jpg

Gaussian Splatting

4.jpg