想象一支考古队在山谷里发现了一座被泥石流掩埋千年的古城。地面上只剩残垣断壁,但游客的老照片、无人机航拍图里,却记录着古城曾经的模样。考古队能不能只凭这些二维照片,在电脑里重建出一座完整的古城?答案是能——这正是3D重建在做的事。3D重建,就是从一组二维图像或视频中恢复出物体或场景三维结构的技术。它的流程,恰如考古队的复原步骤:先采集照片,再在不同照片里找到同一个标记,推断每张照片的拍摄位置,然后拼出古城骨架、填上砖墙细节、最后贴上原有的壁画颜色。这个过程中,“找到同一个标记”靠特征提取与匹配,“拼骨架”靠稀疏重建SfM,“填砖块”靠稠密重建MVS,“贴壁画”靠表面重建与纹理映射。而近年来火热的神经渲染NeRF,则像一位看遍古城照片的AI画家,能直接“脑补”出任意视角的古城景象。这篇文章将带你以考古队为线索,一步步看懂3D重建的完整流程、核心原理与工具选择。

岗位关联

3D重建是计算机视觉从“看懂图像”走向“理解三维世界”的关键能力。掌握它,你就能在高精地图、AR/VR、数字文保、工业测量等一线AI应用中建立起核心技术竞争力。

目录
  1. 可视化演示
  2. 三维重建概览
  3. 相机成像原理
  4. 特征提取匹配
  5. 稀疏重建SfM
  6. 稠密重建MVS
  7. 表面重建与纹理
  8. 神经渲染NeRF
  9. 应用与工具
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

本节配有交互动效(进入视口后自动加载,约 3KB)。

双目立体视差 左右相机观察同一场景 视差越大深度越近 深度 = f×B/disparity 从2D图像恢复3D几何结构

三维重建概览

考古队面对上千张照片时,最忌讳埋头就干。他们要先把整个复原计划想清楚:拍哪些角度、找什么标记、如何拼骨架、怎么补细节、最后怎么上色。3D重建也是一样,入门的第一步是看懂全局。所谓3D重建,就是从二维图像或视频中恢复物体或场景的三维结构。它输出的可能是一堆三维点云,也可能是一张带纹理的三角网格,甚至是NeRF那样的隐式辐射场。

整个流程环环相扣:先做特征提取与匹配,解决“哪些像素对应现实中的同一个点”;再做稀疏重建SfM,同时估计相机位姿和稀疏三维点;接着用稠密重建MVS把点云从稀疏补成密集;然后做表面重建与纹理映射,得到可渲染的网格模型;最后还可以借助NeRF等神经渲染方法,从照片直接学习出任意视角的新视图。这条流水线,就是考古队从“一堆老照片”到“数字古城”的完整施工图。

为什么3D重建如此重要?自动驾驶需要厘米级高精地图,AR/VR需要真实感三维场景,数字文保需要为不可移动的石窟建立档案,工业制造需要比对零部件的三维形变。它的核心挑战也很明确:无纹理表面难以匹配特征、强光照变化破坏颜色一致性、遮挡造成结构缺失、大规模场景计算量惊人,这些都在考验整个管线的鲁棒性。

可以这样理解3D重建的全局:它是给二维照片找回第三个维度的“考古工程”。先找共同标记,再定机位,再填砖块,最后上色。接下来的每一节,就是深入这座古城的每一个工位。

M=T(MVS(SfM(F({Ii}i=1N))))\displaystyle \mathcal{M} = \mathcal{T}\Big( \mathrm{MVS}\big( \mathrm{SfM}\big( \mathcal{F}\big( \{\mathcal{I}_i\}_{i=1}^{N} \big) \big) \big) \Big)
这个式子把3D重建的完整管线压缩成一行:照片集经过特征提取、稀疏重建、稠密重建、表面纹理化,最终得到三维模型。
  1. 输入照片集N张不同视角的二维照片是重建的原材料,相当于考古队的游客照与航拍图。
    {Ii}i=1N\{\mathcal{I}_i\}_{i=1}^{N}
  2. 特征提取$\mathcal{F}$ 从每张照片中提取可重复识别的标记点,是后续所有步骤的地基。
    F(⋅)\mathcal{F}(\cdot)
  3. 稀疏重建SfM估计相机位姿与稀疏三维点,搭出古城的骨架。
    SfM(⋅)\mathrm{SfM}(\cdot)
  4. 稠密重建MVS在骨架基础上填充密集三维点云,补全砖墙细节。
    MVS(⋅)\mathrm{MVS}(\cdot)
  5. 表面与纹理$\mathcal{T}$ 将点云转化为带纹理的三维网格模型 $\mathcal{M}$,即最终的数字古城。
    T(⋅)⇒M\mathcal{T}(\cdot) \Rightarrow \mathcal{M}

相机成像原理

考古队拿到照片,第一件事是确认每张照片的拍摄位置与镜头参数:那张是站在东门用50mm镜头拍的,这张是无人机在30米高空用广角拍的。因为同一根柱子,从不同机位拍出来形状完全不同。要复原三维结构,必须先弄懂相机如何把三维世界压成二维像素。

这个公式的起点是针孔模型。想象一个密封箱子只留一个小孔,光线穿过小孔在底部形成倒立的像。实际相机用透镜代替小孔,但针孔模型在数学上仍是极好的近似。它用一个内参矩阵描述相机自身的性质——焦距、光心、像素尺度;用一个外参矩阵描述相机在世界坐标系中的位姿——旋转和平移。

在3D重建中,相机参数很少被手工测量,而是在SfM流程中同步估计出来的。每张照片的“内参标签”和“外位姿便签”被计算出来后,照片就变成了一条条记录光线来源方向的数学光线,后续的三角测量、深度估计都建立在这些光线之上。另外,镜头还会引入径向畸变和切向畸变,重建前需要对图像做畸变校正,否则远处直线会变成弧线,直接影响重建精度。

内参是“镜头标签”,外参是“机位便签”。考古队一旦给每张照片贴上这两个便签,照片就不再是孤立的画面,而是一整套可计算的“三维线索集”。

λ[uv1]=K [R  ∣  t][XYZ1]\displaystyle \lambda \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = \mathbf{K} \, [\mathbf{R} \;|\; \mathbf{t}] \begin{bmatrix} X \\ Y \\ Z \\ 1 \end{bmatrix}
这是相机成像的“总方程式”:三维世界里的一个点,经过外参旋转平移、内参缩放偏移,最终落到像素平面上。
  1. 三维点坐标$\begin{bmatrix} X \\ Y \\ Z \\ 1 \end{bmatrix}$ 是空间中某个标记点在相机世界坐标系下的齐次坐标。
    [XYZ1]\begin{bmatrix} X \\ Y \\ Z \\ 1 \end{bmatrix}
  2. 外参矩阵$[\mathbf{R} \;|\; \mathbf{t}]$ 描述相机在世界中的旋转和平移,即“从哪个机位拍的”。
    [R  ∣  t][\mathbf{R} \;|\; \mathbf{t}]
  3. 内参矩阵$\mathbf{K}$ 包含焦距、光心等相机固有参数,即“镜头的标签”。
    K=[fx0cx0fycy001]\mathbf{K} = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix}
  4. 像素坐标$\begin{bmatrix} u \\ v \\ 1 \end{bmatrix}$ 是三维点投影到图像上的像素位置。
    [uv1]\begin{bmatrix} u \\ v \\ 1 \end{bmatrix}
  5. 深度因子$\lambda$ 是齐次坐标的缩放因子,用来把投影结果归一化到像素平面,对应着三维点到相机的深度。

特征提取匹配

一万张游客照里,怎么知道哪两张拍的是同一根柱子?游客不会在柱子旁立GPS标记,但柱子表面的裂纹、花纹、色斑就是天然路标。考古专家能在不同照片中找到同一处裂纹,从而把这两张照片关联起来。计算机视觉中的“特征点”,正是这样的天然路标。

特征点要满足两个性质:够独特——周围纹理有明显区分度;够稳定——视角、光照变化时依然能被重复找到。SIFT是这类算法的代表:它在尺度空间中搜索极值点作为关键点,再统计邻域梯度方向直方图,生成一个128维的描述子向量,用来概括局部纹理信息。

有了描述子,还要设计匹配策略。Lowe提出的最近邻距离比测试很巧妙:如果某个特征点的最近邻距离远小于次近邻距离,说明匹配是明确的、独特的;如果两者差不多,说明该点处于重复纹理区域,匹配不可靠,应丢弃。匹配完成后,再用RANSAC算法剔除误匹配。RANSAC随机采样少量匹配点来估计几何模型(如基础矩阵F),统计符合该模型的内点数量,反复迭代后保留内点最多的模型,把“捣乱”的误匹配全部筛掉。

RANSAC就像考古队长拿筛子筛选报告:先随机问几个人“那根柱子大概在什么方位”,看看多少人意见一致,同意的人越多越可信;反复筛选后,保留那份最可靠的“证人名单”。

∥dq−dnn1∥2∥dq−dnn2∥2<τ,τ≈0.7\displaystyle \frac{\|\mathbf{d}_q - \mathbf{d}_{\mathrm{nn}_1}\|_2}{\|\mathbf{d}_q - \mathbf{d}_{\mathrm{nn}_2}\|_2} < \tau, \quad \tau \approx 0.7
这是特征匹配的“信任判据”:只有当最近邻明显优于次近邻时,我们才敢相信这是一对真匹配。
  1. 查询描述子$\mathbf{d}_q$ 是待匹配特征点的128维描述子向量,浓缩了该点附近的纹理信息。
    dq\mathbf{d}_q
  2. 最近与次近$\mathbf{d}_{\mathrm{nn}_1}$ 和 $\mathbf{d}_{\mathrm{nn}_2}$ 是候选库中与该描述子距离最近、第二近的两个特征。
    dnn1,dnn2\mathbf{d}_{\mathrm{nn}_1}, \mathbf{d}_{\mathrm{nn}_2}
  3. L2距离$\|\cdot\|_2$ 表示欧氏距离,衡量两个描述子的相似程度,距离越小越相似。
    ∥dq−dnn1∥2\|\mathbf{d}_q - \mathbf{d}_{\mathrm{nn}_1}\|_2
  4. 距离比阈值$\tau$ 取0.7左右,比值小于该阈值才认为是可信匹配,值越小匹配越严格。
    τ≈0.7\tau \approx 0.7
  5. 决策规则最近距离不到次近距离的70%,说明该匹配“独一无二”,采纳;否则可能是重复纹理造成的,丢弃。

稀疏重建SfM

有了可靠的匹配名单,考古队开始回答两个关键问题:每张照片的机位在哪里?那些被反复确认的标记在三维空间中到底在哪?这就像两台测距仪同时指向一个目标,两条光线的交会点就是目标的空间位置。这就是SfM(Structure from Motion,运动恢复结构)要做的事。

SfM的数学基础是对极几何:两个视角观察同一个三维点,它在两幅图像上的像素坐标之间存在约束关系,可以用本质矩阵E(已知内参)或基础矩阵F(未知内参)来描述。从匹配点估计出E或F之后,就能恢复两视图之间的相对旋转和平移,再通过三角测量恢复三维点的坐标。

经典实现是增量式SfM:先用两视图初始化相机位姿和三维点,然后逐张添加新图像,估计新相机位姿、三角化新点;每加入几张图就跑一次光束法平差(Bundle Adjustment),同步微调所有相机位姿和所有三维点,使重投影误差整体最小。这个过程要特别注意累积漂移——图像一张张加进来,误差也会一点点累积,所以BA是SfM里不可或缺的“纠偏手术”。

这就像考古队先用三脚架定出基准点,再造一座接一座地拼接遗迹,每拼一段就拉一次水平仪校准,防止整座古城在累积误差中悄悄“跑偏”。

min⁡{Ri,ti},{Xj}∑i,j∥xij−π(K,Ri,ti,Xj)∥22\displaystyle \min_{\{\mathbf{R}_i, \mathbf{t}_i\}, \{\mathbf{X}_j\}} \sum_{i,j} \left\| \mathbf{x}_{ij} - \pi\left( \mathbf{K}, \mathbf{R}_i, \mathbf{t}_i, \mathbf{X}_j \right) \right\|_2^2
光束法平差的目标,是把所有相机位姿和三维点放在一起“打磨”,让每个三维点重投影到每张图像上的误差最小。
  1. 重投影误差$\mathbf{x}_{ij}$ 是第 $j$ 个三维点在图像 $i$ 中的实际像素坐标,投影函数 $\pi$ 则把三维点重新投回像素平面。
    xij\mathbf{x}_{ij}
  2. 投影函数$\pi\left( \mathbf{K}, \mathbf{R}_i, \mathbf{t}_i, \mathbf{X}_j \right)$ 表示给定内参与相机位姿,将三维点 $\mathbf{X}_j$ 投影到图像 $i$ 上的预测位置。
    π(K,Ri,ti,Xj)\pi(\mathbf{K}, \mathbf{R}_i, \mathbf{t}_i, \mathbf{X}_j)
  3. 优化变量$\mathbf{R}_i, \mathbf{t}_i$ 是第 $i$ 个相机的旋转与平移,$\mathbf{X}_j$ 是第 $j$ 个三维点坐标,它们都是待优化量。
    Ri,ti,Xj\mathbf{R}_i, \mathbf{t}_i, \mathbf{X}_j
  4. 平方和将所有观测的预测误差求平方和,放大大误差的影响,防止个别野值干扰整体优化。
    ∑i,j∥⋅∥22\sum_{i,j} \|\cdot\|_2^2
  5. 最小化调整所有相机和三维点,让误差平方和最小,相当于让整座古城的每一根梁柱都严丝合缝。

稠密重建MVS

SfM的产物是一副“骨架图”:立柱和房梁的位置有了,但墙面砖缝、门楣浮雕还是一片空白。要让数字城真正做到“可以走进去”,得把每个像素都变成三维点。这就要靠MVS(Multi-View Stereo,多视图立体视觉)。

MVS的核心思想极朴素——多视图一致性。你从十个角度观察一面墙,如果每个角度看到的颜色和纹理都能对上,那这面墙就在那里。具体做法是:给定一个已标定的相机,对参考视图的每个像素,扫描一系列候选深度值;对每个候选深度,把该像素重投影到其他视图,比较颜色差异;颜色最一致的那个深度,就是该像素的最优深度。这样每个像素得到一个深度值,汇成一张深度图。

把所有视图的深度图放在一起,就能融合出一朵稠密点云。融合时要考虑遮挡:某些点在某个视图中可见、在另一个视图中被遮挡,需要加权或剔除。经典方法通过代价体(Cost Volume)进行批量深度扫描,也有PatchMatch这类通过随机搜索与传播来高效估计深度的方法。输出通常是一张带法线的高密度点云,数量从SfM的几千个点暴增到数百万甚至上亿个点。

MVS最朴素的哲学,跟考古队判断“这面墙是不是原来的墙”完全一致:从多个角度反复看,看到的花纹颜色都对得上,那它就是真的墙面。

d∗(p)=arg⁡min⁡d∑i=2Nwi⋅ρ(I1(p), Ii(πi(p,d)))\displaystyle d^*(\mathbf{p}) = \arg\min_{d} \sum_{i=2}^{N} w_i \cdot \rho\left( I_1(\mathbf{p}),\ I_i\left(\pi_i(\mathbf{p}, d)\right) \right)
深度估计的“投票法则”:对每个候选深度,让多个视图对颜色一致性投票,得票最多(代价最小)的深度获胜。
  1. 参考像素$\mathbf{p}$ 是参考图像中需要估计深度的像素坐标。
    p\mathbf{p}
  2. 候选深度$d$ 是沿视线方向扫描的候选深度值,从近平面到远平面逐层尝试。
    dd
  3. 重投影$\pi_i(\mathbf{p}, d)$ 将像素 $\mathbf{p}$ 按深度 $d$ 重投影到第 $i$ 个视图中的坐标。
    πi(p,d)\pi_i(\mathbf{p}, d)
  4. 颜色一致性$\rho$ 比较参考像素颜色 $I_1(\mathbf{p})$ 与重投影位置颜色 $I_i(\cdot)$ 的差异,差异越小越一致。
    ρ(I1(p), Ii(⋅))\rho\left( I_1(\mathbf{p}),\ I_i(\cdot) \right)
  5. 加权融合$w_i$ 是视图权重,用来降低遮挡视图的影响;$\arg\min$ 在所有候选深度中挑出总代价最小的那个作为 $d^*$。
    arg⁡min⁡d\arg\min_{d}

表面重建与纹理

考古队现在有几百万个“砖块坐标”,但终究是一堆离散点。要拼出一面能触摸的墙,得判断哪些点属于同一平面、门窗轮廓在哪里、坍塌的屋顶如何补全。这就像把一堆碎石拼回一座雕塑。表面重建(Surface Reconstruction)的任务,就是把稠密点云变成连续的三角网格。

经典方法是泊松重建。它的思路很优雅:先估计每个点云的法线方向,构成一个向量场;然后求一个标量场(指示函数),使它的梯度最接近这个向量场。解出泊松方程后,提取等值面就得到了封闭的表面网格。泊松重建对噪声和空洞有不错的鲁棒性,是COLMAP等工具后的常用选择。

网格生成之后还要贴纹理。纹理映射从已有照片中为网格的每个面片挑选最佳视图作为纹理源,把照片像素映射到面片上。这需要处理遮挡判断、不同照片的曝光差异、面片接缝的颜色一致性等问题,必要时还要做多视图颜色融合,否则模型上会出现明显的“补丁感”。最终得到的,是一座在电脑里可以自由走动的数字古城。

泊松重建像一位雕塑家,从石块的朝向与形状推断出完整的雕像轮廓;纹理映射则像给雕像覆上原色——把游客照片里的壁画颜色一块块“还”回墙上。

Δχ=∇⋅V\displaystyle \Delta \chi = \nabla \cdot \mathbf{V}
泊松方程是表面重建的“总指挥”:它让指示函数的梯度尽量贴近点云法线场,从而恢复出隐式的表面。
  1. 指示函数$\chi$ 在物体内部取1、外部取0,它的等值面就是物体表面。
    χ\chi
  2. 拉普拉斯算子$\Delta \chi$ 表示指示函数的二阶导数,等于 $\nabla \cdot (\nabla \chi)$,刻画表面的局部弯曲。
    Δχ\Delta \chi
  3. 法线向量场$\mathbf{V}$ 是由点云法线插值得到的向量场,表示每个位置“表面朝向哪里”。
    V\mathbf{V}
  4. 散度$\nabla \cdot \mathbf{V}$ 是向量场的散度,衡量法线场的汇聚或发散,是方程的“已知输入”。
    ∇⋅V\nabla \cdot \mathbf{V}
  5. 求解表面解出 $\chi$ 后,提取 $\chi = 0.5$ 的等值面,即得到平滑的三角网格模型。
    χ=0.5\chi = 0.5

神经渲染NeRF

前面的流程步骤多、公式繁,遇到无纹理白墙、镜子、玻璃这类场景,传统方法常常抓瞎。有没有更省事的思路:把大量照片喂给一个AI,让AI直接“长出”整个三维场景,还能渲染出任意角度的新照片?这就是NeRF(Neural Radiance Fields,神经辐射场)。

NeRF用神经网络隐式表示三维场景:输入一个空间位置 $\mathbf{p}$ 和观察方向 $\mathbf{d}$,网络输出该点的颜色 $\mathbf{c}$ 和密度 $\sigma$。训练时,从相机出发沿视线方向发射一条射线,在射线上采样多个点,把每个点的颜色按密度加权累积,得到该像素的渲染颜色;将渲染颜色与真实照片的像素颜色对比,反向传播更新网络参数。多次迭代后,网络就“记住”了场景的几何与外观。

为了让网络表达高频细节,NeRF引入了位置编码,把三维坐标映射到多组正弦/余弦函数上,让网络能刻画细小的纹理变化。体渲染积分是可微的,因此整个训练过程可以端到端进行。NeRF的变体也层出不穷:Instant-NGP用哈希网格实现秒级训练,Mip-NeRF处理多尺度模糊问题,3D Gaussian Splatting用大量高斯椭球取代网络查询,实现了实时渲染,把神经重建推向了工业落地。

如果说传统方法是“考古手艺人按步骤复原”,NeRF就像一位看遍古城所有照片的AI画家:它没砌过砖,但你说“我想看从西城门望出去的样子”,它立刻就能画出来。密度高的地方是实体,密度低的地方是空气。

C(r)=∫tntfT(t) σ(r(t)) c(r(t),d) dt,T(t)=exp⁡(−∫tntσ(r(s)) ds)\displaystyle C(\mathbf{r}) = \int_{t_n}^{t_f} T(t)\, \sigma(\mathbf{r}(t))\, \mathbf{c}(\mathbf{r}(t), \mathbf{d})\, dt, \quad T(t) = \exp\left( -\int_{t_n}^{t} \sigma(\mathbf{r}(s))\, ds \right)
体渲染公式是NeRF的“画笔”:沿一条光线,把所有采样点的颜色按透明度加权累加,得到最终像素颜色。
  1. 光线参数化$\mathbf{r}(t)$ 是从相机出发的射线,$t$ 表示沿射线的深度,$t_n$ 到 $t_f$ 是近远平面范围。
    r(t),t∈[tn,tf]\mathbf{r}(t), \quad t \in [t_n, t_f]
  2. 密度场$\sigma(\mathbf{r}(t))$ 是该空间点的体积密度,密度越大,该点越像实体表面。
    σ(r(t))\sigma(\mathbf{r}(t))
  3. 颜色场$\mathbf{c}(\mathbf{r}(t), \mathbf{d})$ 是空间点在视角方向 $\mathbf{d}$ 下的RGB颜色,支持各向异性的观感。
    c(r(t),d)\mathbf{c}(\mathbf{r}(t), \mathbf{d})
  4. 透过率$T(t)$ 是光线从 $t_n$ 传播到 $t$ 的透过率,中间密度越大,光线越难穿过。
    T(t)=exp⁡(−∫tntσ ds)T(t) = \exp\left(-\int_{t_n}^{t} \sigma\, ds\right)
  5. 积分渲染把射线上每个点的颜色按“能到达该点的概率”加权累加,积分结果就是像素的最终颜色 $C(\mathbf{r})$。
    ∫tntfT(t) σ c dt\int_{t_n}^{t_f} T(t)\, \sigma\, \mathbf{c}\, dt

应用与工具

数字古城复原完成,展览开幕。观众戴上VR头盔漫步街巷,专家在电脑上测量柱径并比对历史文献,电影特效师把龙卷风叠加到古城上空。从展览到科研到商业,3D重建技术已经敲开了无数扇门。而支撑这一切的,是一套成熟的开源工具链。

应用场景已十分广泛:自动驾驶用多目相机重建城市高精地图,把车道线、路沿、交通标志的厘米级三维位置固化在地图中;电商用手机环绕视频重建商品3D模型,让用户在详情页360°查看;工业质检通过三维扫描比对零部件形变;元宇宙与数字孪生更直接把真实世界搬进虚拟空间。

工具选择上,经典流程首选COLMAP——它是目前最流行的SfM/MVS一体化工具,开箱即用,提供命令行与GUI;OpenMVG与OpenMVS提供模块化的多视图几何与稠密重建;MeshLab、Blender负责网格后处理与纹理编辑。神经重建方向,NVIDIA的Instant-NGP训练速度极快,NeRFStudio是研究与实践的集成套件,3D Gaussian Splatting则凭借实时渲染成为新宠。选型建议:小物体或商品展示,用NeRF系方案最省事;城市级大场景,还是COLMAP+MVS+MeshLab的经典流程更稳;实时AR应用,优先3D Gaussian Splatting。

至于如何评判重建质量,PSNR(峰值信噪比)是常用指标之一:把新视角渲染图与真实照片逐像素对比,PSNR越高,说明渲染与真实越接近。这就像给古城的“复原度”打分——梁柱位置对、壁画颜色鲜,分数自然就高。

PSNR=10log⁡10(25521HW∑i,j(Iijgt−Iijrender)2)\displaystyle \mathrm{PSNR} = 10 \log_{10}\left( \frac{255^2}{\frac{1}{HW}\sum_{i,j}\left( I^{gt}_{ij} - I^{render}_{ij} \right)^2} \right)
PSNR是给重建结果打分的“复原度尺子”:渲染图与真实照片越像,分数越高。
  1. 真实像素$I^{gt}_{ij}$ 是真实拍摄照片在位置 $(i,j)$ 的像素值,作为比对的“标准答案”。
    IijgtI^{gt}_{ij}
  2. 渲染像素$I^{render}_{ij}$ 是算法在新视角下渲染图像的对应像素值。
    IijrenderI^{render}_{ij}
  3. 均方误差分母的 $\frac{1}{HW}\sum (\cdot)^2$ 是两幅图像的均方误差MSE,反映整体差异大小。
    MSE\mathrm{MSE}
  4. 像素峰值255 是8位图像的最大像素值,用来归一化误差。
    2552255^2
  5. 对数折算$10 \log_{10}$ 把MSE折算成分贝刻度,PSNR越高,渲染质量越好,超过30dB通常已可乱真。
    10log⁡10(⋅)10 \log_{10}(\cdot)

AI 应用场景

高精地图重建:为自动驾驶“数字古城”

阶段:稀疏重建SfM + 稠密重建MVS

解决的问题:传统高精地图依赖激光雷达采集车,设备昂贵、采集周期长。AI利用多目相机或环视相机的图像,通过3D重建流程自动生成车道线、停止线、路沿的厘米级三维位置,大幅降低采集成本并支持快速更新。

具体案例:某自动驾驶公司派出数十辆搭载环视相机的量产车,采集城市道路图像后,用类COLMAP流程离线重建出覆盖核心城区的高精地图。在后续调查中,车道线三维误差控制在3厘米以内,支撑了车道级导航与自动泊车。

云冈石窟数字化:给千年文物建“数字档案”

阶段:神经渲染NeRF

解决的问题:石窟不可移动、结构脆弱,传统扫描设备难以深入洞窟,且接触式测量有损伤风险。NeRF只需利用游客和研究者多年积累的海量照片,就能重建出可任意角度查看的高保真数字石窟,用于保护记录、虚拟修复和文化传播。

具体案例:北京大学与云冈石窟研究院合作,利用NeRF技术对昙曜五窟进行数字重建,观众在线上就能漫游洞窟、缩放查看雕像细节,专家可以隔着屏幕精确测量佛像比例,为文物保护建立珍贵档案。

电商3D商品展示:让买家“拿”起商品

阶段:手机多视角采集 → SfM/NeRF重建 → 3D交互展示

解决的问题:传统电商只有平面图片,买家难以感知商品的形状、质感和比例,导致退货率高。AI让商家用手机拍摄一段30秒环绕视频,自动重建可旋转、可缩放的3D商品模型,显著降低决策不确定性。

具体案例:某头部电商平台上线“3D商品秀”功能,商家上传环绕视频后,系统利用NeRF重建生成3D模型,并在商品详情页嵌入WebGL查看器。上线三个月后,开通该功能的商品退货率平均下降约15%。

Python 演示

python59 行
import numpy as np  def make_camera(R, t, K):    P = np.zeros((3, 4))    P[:, :3] = K @ R    P[:, 3] = K @ t.reshape(3)    return P  def project(P, X):    Xh = np.append(X, 1.0)    x = P @ Xh    return x[:2] / x[2]  def triangulate(P1, P2, x1, x2):    A = np.zeros((4, 4))    A[0] = x1[0] * P1[2] - P1[0]    A[1] = x1[1] * P1[2] - P1[1]    A[2] = x2[0] * P2[2] - P2[0]    A[3] = x2[1] * P2[2] - P2[1]    _, _, Vt = np.linalg.svd(A)    Xh = Vt[-1]    return Xh[:3] / Xh[3]  def main():    K = np.array([[800, 0, 320],                  [0, 800, 240],                  [0, 0, 1.0]], dtype=float)    R1 = np.eye(3)    t1 = np.zeros(3)    P1 = make_camera(R1, t1, K)     theta = np.radians(30)    R2 = np.array([[np.cos(theta), 0, np.sin(theta)],                   [0, 1, 0],                   [-np.sin(theta), 0, np.cos(theta)]])    t2 = np.array([0.8, 0.0, 0.0])    P2 = make_camera(R2, t2, K)     rng = np.random.default_rng(42)    points3d = rng.uniform(-1.0, 1.0, (30, 3))     errors = []    for X in points3d:        x1 = project(P1, X)        x2 = project(P2, X)        X_rec = triangulate(P1, P2, x1, x2)        errors.append(np.linalg.norm(X - X_rec))     print(f"平均三角化误差: {np.mean(errors):.3e}")    print(f"最大误差: {np.max(errors):.3e}")    print(f"点数: {len(points3d)}")  if __name__ == "__main__":    main()
目的:用两个已知位姿的相机模拟“双视角测距”,从二维投影点反推三维坐标,演示SfM中三角测量的最小核心。
  1. P[:, :3] = K @ R将内参矩阵K与旋转矩阵R相乘,得到投影矩阵前三列,完成世界坐标到相机坐标的变换。
  2. P[:, 3] = K @ t.reshape(3)加上平移项,把相机坐标系原点移到世界坐标系对应位置。
  3. x[:2] / x[2]齐次坐标归一化:把投影结果除以深度分量,得到真实的像素坐标 (u, v)。
  4. A[0] = x1[0] * P1[2] - P1[0]构造DLT线性三角化的约束行,它来自“图像点叉乘投影矩阵等于零”这一几何事实。
  5. np.linalg.svd(A)对4×4矩阵做奇异值分解,求解超定线性方程组;最小奇异值对应的右奇异向量就是三维点齐次坐标。
  6. Xh[:3] / Xh[3]把齐次坐标转回普通三维坐标 (X, Y, Z),完成三角测量。
  7. errors.append(np.linalg.norm(X - X_rec))计算恢复点与真实点的欧氏距离,评估三角化精度。
  8. np.mean(errors)输出平均误差,验证在理想条件下三角测量能高精度恢复三维结构。

常见误区

误区很多人以为3D重建就像手机人像模式,随便拍两张照片就能得到完整的3D模型,不需要其他任何信息。

正解传统3D重建需要多张具有重叠视角的照片,并要精确估计相机位姿。即使NeRF这类现代方法,也需要数十张不同角度的照片,且通常依赖COLMAP计算相机参数。两张照片只能恢复极稀疏的深度,精度和完整性远不足以生成可用的3D模型。

为何常见:手机AR、人像虚化等功能过于顺滑,让人误以为“从图像算深度”是轻而易举、不需要多视角的事。

误区既然NeRF能从照片直接生成任意视角的图像,传统SfM和MVS似乎已经过时,不值得再学。

正解NeRF通常需要COLMAP提供的相机位姿作为输入,本身并不解决“位姿从哪来”的问题。在需要精确几何测量、无纹理表面、大规模城市场景中,传统SfM/MVS依然是更可靠的选择。两者互补,许多NeRF变体还会用传统深度先验来提升效果。

为何常见:学术界与媒体常展示NeRF惊人的渲染效果,却很少提及它对相机位姿的依赖和几何精度的不足。

误区以为COLMAP这类工具只要把一堆照片丢进去,就能自动输出完美点云,失败了一定是工具不行。

正解照片的重叠度、运动模糊、光照变化、场景的弱纹理与重复纹理、初始相机参数是否准确,都会直接影响重建成败。实际项目中往往需要筛选图像、添加掩膜、约束相机轨迹、甚至分段重建再拼接,是一个需要大量工程调参的过程。

为何常见:开源工具提供了一条命令行就出结果的友好体验,入门者只看到成功的示例,很少接触背后大量的失败案例。

误区网格建好后,随便选几张照片把颜色贴上去就行,纹理映射没什么技术含量。

正解一个网格面片可能被多个视图同时可见,选择哪张照片做纹理源、如何让相邻面片的颜色连续、如何处理曝光差异与遮挡,都需要专门算法。用马尔可夫随机场选源、做颜色融合与接缝修整,否则模型上会出现明显的亮度跳变和“贴纸感”。

为何常见:3D建模软件里一键贴图的功能太普及,掩盖了多视图光照不一致这个核心难点。

误区用户拿到重建结果,期待它是一个像雕塑一样实心的体块,能直接做内部应力分析或切面观察。

正解绝大多数重建输出只是表面网格,内部是空的。这对可视化、渲染、动画完全够用,但要做有限元分析或体素切割,还需要额外处理,比如把封闭网格体素化,或者改用基于体素的体积重建方法。

为何常见:“3D模型”在大众认知中常与实心物体关联,而渲染管线只关心表面,这一关键差异很少被科普提及。

面试题

Q1. 相机外参描述的是什么?

单选题 · easy

  • A.相机的像素色彩精度
  • B.相机在世界系的位置姿态← 正确答案
  • C.镜头的畸变参数集合
  • D.图像传感器的感光度

答案:B。外参由旋转矩阵R和平移向量t组成,描述相机在世界坐标系中的位置与朝向。内参K才描述焦距、光心等镜头固有属性,畸变参数属于内参范畴,感光度与重建无关。考古队“机位便签”对应的正是外参。

Q2. SIFT特征中“描述子”的主要作用是?

单选题 · easy

  • A.对关键点的纹理信息进行编码← 正确答案
  • B.压缩图像的存储空间
  • C.增强图像的整体对比度
  • D.自动校正相机的畸变

答案:A。描述子是一个高维向量,把关键点周围的梯度方向分布编码成数字,供后续匹配使用。它不负责压缩、增强或畸变校正,那分别是编码器、图像增强和相机标定的事。描述子就像石柱裂纹的“数字化指纹”。

Q3. 在特征匹配中,RANSAC的主要作用是?

单选题 · mid

  • A.加速特征提取的执行速度
  • B.剔除错误的特征点匹配← 正确答案
  • C.增加特征点的提取数量
  • D.优化相机的内参矩阵

答案:B。RANSAC通过随机采样匹配对估计几何模型(如基础矩阵F),并统计内点数量,迭代后保留内点最多的模型,从而把误匹配点剔除干净。它不加速提取、不增加点数也不直接优化内参,而是负责“去伪存真”。

Q4. 下列哪些属于3D重建的经典流程步骤?

多选题 · mid

  • A.特征提取与匹配← 正确答案
  • B.稀疏重建SfM← 正确答案
  • C.稠密重建MVS← 正确答案
  • D.音频降噪增强

答案:ABC。经典3D重建管线是特征提取匹配→SfM→MVS→表面重建与纹理映射。音频降噪属于语音信号处理,与视觉三维重建无关。这就像考古队的复原流程中不会出现“给照片配音”这一步。

Q5. 光束法平差(Bundle Adjustment)优化的对象是?

单选题 · mid

  • A.仅优化相机内参矩阵
  • B.同步优化位姿与三维点← 正确答案
  • C.只优化像素的颜色取值
  • D.独立优化每张图像亮度

答案:B。光束法平差同时调整所有相机的旋转平移和所有三维点坐标,使重投影误差平方和最小化。它不是只调内参,也不管像素颜色和亮度,而是全局打磨相机位姿与场景结构。

Q6. 泊松表面重建的核心是求解哪类方程?

单选题 · mid

  • A.常微分方程
  • B.泊松方程← 正确答案
  • C.贝塞尔方程
  • D.状态转移方程

答案:B。泊松重建求解的是泊松方程Δχ = ∇·V,让指示函数的梯度贴近点云法线场,再提取等值面得到网格。其余选项分别是动力学、曲线插值和随机过程里的工具,与点云建面无关。

Q7. 关于NeRF,下列说法正确的是?

多选题 · hard

  • A.需要已知相机位姿← 正确答案
  • B.使用体渲染模型积分颜色← 正确答案
  • C.无需任何2D图像即可生成
  • D.使用位置编码捕捉高频细节← 正确答案

答案:ABD。NeRF训练前必须由COLMAP等工具提供相机位姿;渲染时沿射线采样并用体渲染积分累积颜色;位置编码把坐标映射到高频正弦余弦函数,帮助网络刻画细节。没有2D图像就没有监督信号,NeRF无从训练,C错误。

Q8. 在稠密重建MVS中,“深度图融合”解决什么问题?

单选题 · hard

  • A.将多张深度图合并为一个整体点云← 正确答案
  • B.提高单张照片的曝光亮度
  • C.增加相机成像的分辨率
  • D.消除图像中的镜头光晕

答案:A。MVS先为每个视图生成一张深度图,深度图融合将这些图上的三维点去重、加权并合并成一朵统一稠密点云。它不负责调曝光、提分辨率或去光晕,而是在三维空间里做“聚集与去重”。

Q9. 针孔相机模型中,内参矩阵K不包含以下哪个量?

单选题 · easy

  • A.像素焦距长度f
  • B.光心的像素坐标
  • C.相机旋转矩阵R← 正确答案
  • D.像素的尺度因子

答案:C。内参矩阵K包含焦距、光心主点坐标以及像素尺度因子,描述相机自身的成像映射。旋转矩阵R属于外参,描述相机在世界坐标系中的朝向,不在K中。这正是“镜头标签”与“机位便签”的边界。

Q10. 关于3D重建的完整认知,下列说法正确的是?

多选题 · extreme

  • A.无纹理区域是MVS的难点← 正确答案
  • B.NeRF通常依赖SfM提供位姿← 正确答案
  • C.稠密点云可以直接用于渲染
  • D.光照变化影响特征匹配稳定性← 正确答案

答案:ABD。无纹理区域像素缺乏区分度,MVS深度估计容易失败;NeRF训练需要准确的相机位姿,通常由SfM提供;光照变化会改变局部外观,使特征描述子匹配失稳。稠密点云只是离散点,直接渲染效果差,通常要先做表面重建和纹理映射,C错误。