数据准备并验证

在真正进入高斯泼溅重建之前,我们首先需要将所有相机的空间参数和对应的图像路径妥善管理起来。为了避免每次都写重复的代码,我们将这些逻辑封装进一个名为 load_cameras 的函数中。

这个函数的核心使命是:接收相机参数和图像路径,返回按顺序排列好的“相机到世界坐标(Camera-to-World)矩阵”和“完整图像路径”。

  1. def load_cameras(cameras_path, images_root, device='cpu', dtype=torch.float32):
  2.     from pathlib import Path
  3.  
  4.     cameras_data = np.load(cameras_path, allow_pickle=True)
  5.     cams = sorted(cameras_data, key=lambda x: x['id'])
  6.  
  7.     camera_to_worlds = []
  8.     image_paths = []
  9.     images_root = Path(images_root)
  10.  
  11.     for cam in cams:
  12.         q = torch.tensor(cam['q'], device=device, dtype=dtype)
  13.         t = torch.tensor(cam['t'], device=device, dtype=dtype)
  14.         c2w = w2c_to_c2w(q, t)
  15.  
  16.         camera_to_worlds.append(c2w)
  17.         image_paths.append(images_root / cam['name'])
  18.  
  19.     return camera_to_worlds, image_paths

写完代码后,我们需要验证相机矩阵是否真正对齐了。

验证方法是取任意一个相机的视角(比如 ID 为 10 或 100),用点云数据进行光栅化渲染,然后用 PIL 将对应的真实图像(Ground Truth)和渲染出的点云图像并排对比。

可视化的完整代码可以查看 Commit b38a126:verify_load_cameras.py

如下方图片可以看到,渲染出的稀疏点云图像与真实图片的视角一致。虽然点云看起来很稀疏,但它为高斯泼溅提供了极其强大和准确的初始化支持。