2442 字
12 分钟
Stereo Vision(立体视觉)- 三维表示与重建
三维几何的经典表示方法(显式 vs. 隐式)
这部分是3D视觉的“地基”,核心是回答:三维数据在计算机里以什么格式存在?
| 表示方法 | 获取难度/来源 | 处理难度 | 对3D表征的优势 | 主要局限 |
|---|---|---|---|---|
| 多视角图像 | 较低。使用普通相机拍摄,数据获取最便捷,成本低。 | 中等。核心是解决2D匹配与3D几何之间的复杂关联问题。 | 信息丰富,包含色彩、纹理等,符合人类视觉习惯,便于利用成熟的2D深度学习模型。 | 信息缺失,是3D世界的2D投影,天生缺少深度维度。需要复杂算法(如MVS)来推断3D结构。 |
| 深度图 | 中等。可通过深度相机直接获取,或由多视角图像(如MVS)计算得到。 | 较低。本质是2D图像,有规则网格结构,处理方便。可与RGB图像结合形成RGB-D数据直接输入2D网络。 | 直观表达深度,是2D到3D的桥梁。通常作为多视图三维重建流程中的中间产物。 | 信息不完全,本质是”2.5D”信息,缺少完整空间结构,受限于单一视角,存在遮挡和视野盲区。 |
| 3D点云 | 多样。可由LiDAR等3D扫描设备直接获取,或是多视角重建流程中的核心输出。 | 中等。数据非结构化、无序,传统算法处理困难。但自PointNet提出后,深度学习方法已成为主流并取得突破。 | 表达灵活、精度高,能较好地保留原始几何细节,是目前三维重建和自动驾驶等领域最核心的表示形式之一。 | 数据稀疏、非结构化,缺少点与点之间的拓扑连接关系,表面不完整。 |
| 网格 (Mesh) | 较高。通常由点云经过表面重建算法生成,是后处理的结果。 | 较高。数据结构复杂,但格式紧凑高效。处理涉及复杂的几何和拓扑运算。 | 高效、视觉效果好,用多边形(通常是三角面片)描述物体表面,存储效率高,广泛用于计算机图形学、动画和渲染。 | 生成复杂,高质量网格的生成算法复杂。本质上只描述表面,无法表达物体内部结构。 |
| 体素 (Voxel) | 极高。通常需要由其他更精确的3D数据(如深度图融合)转换生成。 | 较高。规则化的3D数据,处理逻辑直观但计算和内存开销巨大,分辨率提升会带来立方级的增长,因此通常只能使用低分辨率。 | 直接表达立体,是3D空间的直接扩展,易于进行布尔运算和空间查询。 | 资源消耗巨大,是其主要瓶颈。精度受限于体素大小,难以在有限资源下表达精细结构。 |
参数化曲面:用数学函数显式定义曲面(如 )。
- 易于采样(给定 就能算出点)。
- 易于渲染(直接生成网格或点云)。
- 难以判断一个点是否在形状内部,且难以表示任意拓扑。
隐式曲面:用函数关系定义表面:(如球体 )。
- 极难采样(求解方程困难),
- 极易判断内外(代入函数看正负即可)。
- 易于构造复杂形状(如布尔运算、平滑混合)。
显式表示“好画但难测”(容易渲染,难做碰撞检测);隐式表示“难画但好测”(难渲染,容易判断点是否在体内)。
隐式表示的高级形态:NeRF(神经辐射场)
核心思想:不再显式存储点云或网格,而是用一个多层感知机(MLP)网络隐式地“记住”整个场景。
Ray → 采样点 → MLP → 体渲染 → 像素
- 输入5D:空间坐标 + 观察方向 。多张不同视角的图片 + 相机位姿
- 输出:该点的颜色 (RGB) 和体积密度 (密度 )。
- 通过体渲染公式得到该条射线在图像上的像素值
- 将该数值与真实的图像的像素值计算损失,对网络进行更新。
体渲染(Volume Rendering)公式
沿着相机发射的光线,对路径上的点进行积分
连续模型
- 密度 :表示该点的物体密度,越密集的点越不透明。
- 辐射亮度 :表示该点的颜色,
- 是累计透射率(前面的点越密,后面的光越透不过来)
离散化(工程实现)
这其实就是沿着光线采样一堆点,加权求和得到像素颜色。
网络结构(粗-细两阶段):
- 粗网络:采样较少点(如64个),粗略估计密度分布。
- 细网络:根据粗网络的密度分布,在密度高的区域重点采样(重要性采样,再加128个点),提升细节质量。
通俗理解:NeRF 就像一个“隐式函数”,你问它任意一个三维空间点和视线方向,它都能告诉你这里有没有物体、是什么颜色。优点是合成视角极其逼真,缺点是训练极慢(单场景数小时),且无法实时交互。
实时渲染:3DGS(3D Gaussian Splatting,3D高斯泼溅)
-
高斯(Gaussian):场景中的每个点不再是一个没有体积的点,而是一个3D高斯椭球体,包含以下信息:
- 椭球中心点的位置x,y,z(也即3D高斯的均值)
- 球体的形状(也即3D高斯的协方差矩阵)
- opacity 不透明度,用于splatting渲染
- 球谐函数,拟合视角相关的外观
-
泼溅(Splatting):将这些椭球体沿着特定的角度投影到对应位姿所在的 投影平面(渲染图的平面) 上——一个椭球体投影到平面上会得到一个椭圆
流程:
- 录一段视频或者拍一组不同角度的照片,用一些技术(例如SfM)估计点云。或者直接随机初始化一组点云(此时是稀疏点云)。
- 点云中的每一个点,用一个三维的高斯分布代表,包括点的位置、协方差、不透明度、颜色(球谐系数)。
- 将这些椭球体沿着特定的角度 投影 到对应位姿所在的投影平面上,这一步叫“Splatting“
- 通过计算待求解像素和椭圆中心的距离,可以得到不透明度(越近越不透明),每个椭球体有各自所代表的颜色,于是就可以进行AlphaCompositing来合成颜色。然后快速的对所有像素做这样的计算,这被称作快速 可微光栅化 。
- 得到渲染结果,再与GroundTruth比较得到损失,然后梯度反传,随机梯度下降等进行优化。
一些关键点:
SfM(Structure from Motion,运动恢复结构)
作为 3D重建的第一步,SfM的目标是从多张2D照片中恢复出场景的稀疏点云 + 拍摄时相机位姿,为后续的稠密重建(Dense Reconstruction)提供基础。
具体流程:
- 特征检测与提取:如 SIFT,检测角点,边缘。
- 特征匹配与几何验证:利用之前讲的基础矩阵 和 RANSAC 剔除误匹配。
- 相机模型估计:估计每张照片的内参和外参。
- 稀疏重建:生成稀疏的3D点云,即那些特征点的三维坐标。
可以继续Dense Reconstruction(稠密重建)在稀疏点基础上:生成深度图,补更多点
自适应高斯密度
- 点不够:clone,在需要覆盖更大面积的区域,复制高斯。
- 点太多:prune,剔除那些不透明度过低、对最终成像贡献极小的高斯,保证效率
- 点太大:split,将一个高斯分裂成多个小高斯,覆盖更精细的区域。
对比
| 表示方法 | 特点 | 优点 | 缺点 |
|---|---|---|---|
| NeRF | 神经辐射场,使用神经网络表示3D场景 | 高质量渲染和视点合成,可表示复杂光照和材质 | 训练时间长,实时性差,需要大量计算资源 |
| Implicit Surface | 使用数学函数定义表面,常用SDF表示 | 表示光滑曲面,自然处理变形,支持高级几何运算 | 难以求解,渲染复杂 |
| Point Cloud | 由无连接的点组成,每个点包含位置信息 | 采集简单,适用于扫描数据,灵活性高,可处理大规模数据 | 无拓扑结构,渲染效果受限,重建表面和结构困难,纹理表达差 |
| Mesh | 使用顶点、边和面表示表面,通常为三角形网格 | 几何表示精确,广泛应用,渲染效率高,支持硬件加速 | 表示复杂拓扑结构时可能需要大量数据,对拓扑复杂的模型处理较难 |
| Voxel | 使用体素表示三维空间 | 自然处理体积数据,适用于医学成像,支持布尔运算和体绘制 | 数据量大,存储和处理复杂,分辨率与精度受限,纹理表达差 |
| 3DGS | 使用3D高斯椭球 | 渲染高效、质量高 | 几何表示能力差,存储代价高 |
目前学术界的大趋势是:抛弃中间产物(深度图),直接用隐式神经场(NeRF)或高斯球(3DGS)端到端地重建三维世界,实现极致的视觉效果和实时交互。
Stereo Vision(立体视觉)- 三维表示与重建
https://biscuit0613.github.io/posts/cv/cv-sv-3dconstruction/