项目项目:An Invitation to 3D Vision 官方配套 MATLAB 实现
该项目是计算机视觉经典教材《An Invitation to 3-D Vision: From Images to Geometric Models》的官方配套源代码逻辑实现。项目通过 MATLAB 语言展示了多视图几何的核心流程,旨在将三维解析几何理论转化为可运行的计算框架。该工具包涵盖了从合成场景生成、图像投影、基础矩阵估计到三维结构恢复的完整运动恢复结构(SfM)基础流程,是理解对极几何、相机标定及三角测量等高级视觉概念的实践指南。
功能特性
- 合成三维场景模拟:自动生成立方体框架的三维点云,并模拟多视角摄像机的拍摄位姿。
- 图像投影与噪声模拟:将三维坐标映射至二维像素平面,并引入高斯噪声以评估算法的鲁棒性。
- 鲁棒的基础矩阵估计:采用归一化八点算法,结合坐标预处理技术提高数值稳定性。
- 矩阵秩约束优化:利用奇异值分解(SVD)强制基础矩阵满足秩为 2 的几何约束。
- 本质矩阵分解:从基础矩阵中提取并分解出四组可能的摄像机旋转与平移候选解。
- 线性三角测量:通过求解线性超定方程组,利用双目像素对应关系重构三维空间坐标。
- 手性检测(Cheirality Check):应用物理约束自动筛选正确的相机位姿,确保三维点处于相机前方。
- 误差评估与可视化:计算重投影误差,并提供三维重建点云与相机轨迹的直观显示。
系统要求
- 软件环境:MATLAB R2016b 或更高版本。
- 依赖工具箱:基础 MATLAB 环境(主要使用内置矩阵运算及 SVD 分解函数)。
实现逻辑说明
项目代码的核心逻辑遵循多视图几何的标准流水线,具体步骤如下:
第一步:环境初始化与参数预设。程序首先定义了相机的内参矩阵 K,包括焦距和主点坐标。随后在世界坐标系中生成一个立方体点阵作为已知的三维真值。
第二步:模拟相机运动。定义两个相机位姿。第一相机位于原点,第二相机相对于第一相机绕 Y 轴旋转 15 度并在 X 和 Z 轴方向产生平移。
第三步:正向投影。利用透视投影模型将三维点投影到两个相机的像素坐标系中。为了模拟真实传感器误差,对投影后的坐标添加了特定方差的高斯随机噪声。
第四步:对极几何估计。使用获取的二维像素匹配点辅助计算基础矩阵 F。在此过程中,首先对坐标进行归一化处理(平移至重心并旋转缩放),然后通过 SVD 求解齐次线性方程组,并最后进行秩 2 强制约束调整。
第五步:运动参数恢复。通过相机内参将基础矩阵转化为本质矩阵 E。对 E 进行 SVD 分解,根据对极几何理论推导出四种可能的旋转向量 R 和平移向量 t 的组合。
第六步:空间点重建。针对四种候选位姿,分别调用三角测量函数。通过建立投影矩阵方程并利用最小二乘法解出各点的三维坐标。
第七步:合法性验证。对所有重建解进行深度检测,只有使得所有三维点都在两个相机视野前方的位姿才被判定为正确的运动参数。
第八步:精度评价。将重建后的三维点重新投影回图像平面,计算其与原始带噪声像素点之间的平均欧氏距离,得出平均重投影误差。
关键算法与函数解析
- 模拟场景生成函数:
利用 meshgrid 创建一个三维空间的立方体点阵,并生成对应的颜色向量用于后续可视化区分。
- 投影计算函数:
实现公式 x = K(R*P + t),将世界坐标系下的点 P 转换到相机坐标系后再投影至二维平面,并处理齐次坐标归一化。
- 规范化八点算法函数:
这是核心估值函数。它先通过平移和缩放变换(Normalize Points)使数据点均值为零且方差一致,极大地降低了估计过程中的条件数。随后求解 A*f=0 的最小二乘解,并对结果执行 SVD 截断以保证奇异性。
- 本质矩阵分解逻辑:
利用特定的辅助矩阵 W(反对称旋转矩阵),从 SVD 分解结果 U 和 V 中恢复出旋转和平移。代码中严格检查了旋转矩阵的行列式,确保其符合右手坐标系(det=1)。
- 三角测量函数:
基于 DLT(直接线性变换)方法,针对每个特征点构建 4x4 的矩阵 A,通过寻找 A 的最小奇异值对应的特征向量来确定三维坐标 X。
- 可视化模块:
分双子图展示。左图显示重建的稀疏点云和两个相机在空间中的示意模型(包含光轴显示);右图对比重建点与原始生成点的分布,用以直观验证算法的有效性。