多视角立体视觉技术,从校准图片构建稠密 3D 模型
输入经过 Calibrated 的多张图片(保证完整性),输出稠密的 3D 重建模型(Voxel、Mesh、Points Cloud)
Basic Idea:图像间的密集对应关系
从多个已标定视角提取物体 Silhouette。每个轮廓在三维空间中对应一个由相机中心向外延伸的 Visual Cone,所有 Visual Cone 的交集就是 Visual Hull。
Visual Hull 能稳定恢复物体外轮廓,但无法重建没有出现在任何 Silhouette 上的凹陷结构;轮廓分割误差也会直接影响重建。
在一组候选深度平面上逐层扫描。对每个平面,用相机参数把其他视图 Warp 到参考视图,并计算颜色一致性;一致性最高的平面深度作为该像素的估计。
平面扫描把三维搜索转化为一系列二维 Homography Warp,易于并行,也常用于现代深度网络构造 Cost Volume。
通过轮廓线或者平面扫描,我们通常只能得到粗略结构,因此还需要更精细的深度图进行补全。
我们已知怎么从两张图获得深度图,因此我们两两取对计算深度图,随后融合深度图。不过这时的两两计算应该减少局部约束比如平滑去噪,详情见下图:
之前在 L8 Two-View Stereo 中,我们讨论过逐像素匹配的局限。Patch-based MVS 改用小块区域进行匹配,以利用局部纹理和空间连续性,提高对噪声的鲁棒性。
Patch 是图像中的一个小区域,通常是一个矩形或正方形区域,包含多个像素点(类似于卷积),而且同时包含了该区域面的法向量信息。一方面 patch 不至于过大,我们可以用平面 patch 拟合整体曲面,而平面方便操作计算;另一方面 Patch 又包含了范围信息,对像素的连续性加了较强约束。下图展示了从标准 3D 信息中进行 Patch 重建和点重建的区别:
Patch-based MVS 方法通过比较不同图像中对应 Patch 的相似性来估计深度信息。那么我们如何定义 Patch 之间的相似性呢?
我们将 N (I, J, p) 定义为:在图像 I 和 J 中,Patch p 的一致性函数。我们首先将 3DPatch 投影到两个图像上,随后计算两个 Patch 之间的颜色差异,定义为:
\[N(I,J,p)= \frac{\sum_{k\in\Omega_p}(I_k-\bar I)(J_k-\bar J)} {\sqrt{\sum_{k\in\Omega_p}(I_k-\bar I)^2} \sqrt{\sum_{k\in\Omega_p}(J_k-\bar J)^2}}\]而 $N(p)$ 为所有可见图像对 $V(p) = {I_1,…,I_n}$ 之间的一致性函数的平均值:
\[N(p)=\frac{2}{n(n-1)} \sum_{i=1}^{n}\sum_{j=i+1}^{n}N(I_i,I_j,p)\]Patch 由三维位置、法向量和可见图像集合共同决定。可以通过优化位置和法向量来最大化多视图一致性,常用思路是 Coordinate Descent:每次固定其他变量,只更新一个变量,迭代至收敛。
但更新 V (p) 也很重要,因为随着 Patch 位置和法向量的变化,Patch 可见的图像对也会变化,因此我们需要不断更新 V (p),从而保证一致性函数的正确性。这个函数不可微分,因此我们通过暴力搜索的方式进行更新。首先计算每张图对其他图的一致性函数之和,选择第一个图像作为参考图像,随后选择与参考图像一致性函数最大的图像作为第二个图像,依此类推,直到一致性函数小于某个阈值为止。
我们首先通过几张图片进行特征点匹配,获得初始的 sparse 3D points,然后我们通过这些 sparse 3D points 进行 Patch 初始化,随后进行 Patch 优化。
随后我们对 Patch 进行拓展和过滤:
NeRF 是一种神经场表示与可微渲染方法,通过网络表示空间中的体密度和视角相关颜色。它首先用于 Novel View Synthesis,也可从密度场中提取近似几何,但不能简单等同于传统显式 Mesh 重建。
首先 NeRF 是以光线为基础的,我们通过相机参数和像素位置生成光线,随后通过神经网络预测光线上的体积密度和颜色信息,最后通过体积渲染技术合成图像。具体来说,我们设 s 是光线上的某个位置,一束光在该位置的颜色为 $I(s)$,初始颜色为 $I(0)$,然后空间在某一位置的“密度”为 $\tau(s)$ 那么我们有以下公式表示光线经过一段路径抵达 s 产生的衰减(假设这段位移很小,密度相同):
\[\frac{dI(s)}{ds} = -\tau(s) I(s)\]这是一阶线性微分方程,我们可以通过积分得到光线终点的颜色:
\[I(s) = I(0) \exp(-\int_{0}^{s} \tau(t) dt)\]这里我们考虑物理意义,$\exp(-\int_{0}^{s} \tau(t) dt)$ 可以表示光线在路径上由于介质吸收而衰减的比例。我们表示不透明度为 $\alpha(s) = 1 -\exp(-\int_{0}^{s} \tau(t) dt)$,那么我们有:
\[I(s) = I(0) (1 - \alpha(s))\]这样我们获得了在通过一段已知密度介质中的光线颜色。随后我们将整段光线分割成多个小段,我们可以获得最后的颜色为:
\[I(L) = \sum_{i=1}^{N} \prod_{j=1}^{i-1} (1 - \alpha_j) c_i \alpha_i\]随后通过神经网络预测密度 $\tau(s)$ 和颜色 $c(s,d)$。标准 NeRF 中密度主要由位置决定,颜色还依赖观察方向:
\[(\tau(s),c(s,d))=\operatorname{MLP}(s,d)\]3D Gaussian Splatting 使用一组带位置、各向异性协方差、透明度和视角相关颜色的三维高斯表示场景。渲染时将高斯投影并 Splat 到图像平面,避免像 NeRF 那样沿每条射线密集查询 MLP,因此通常具有更高的实时渲染效率。它与 NeRF 的表示差异可回顾 Neural Implicit Representations。
Here are some more articles you might like to read next: