如何用 COLMAP 制作 Blender 格式的数据集并划分出 transforms_train.json
、transforms_val.json
和 transforms_test.json
。
一、什么是 Blender 格式数据集?
Blender 格式数据集是 Nerf 和 Nerfstudio 常用的输入格式,其核心是包含了相机内外参的 JSON 文件,一般命名为:
-
transforms_train.json
—— 训练用帧信息 -
transforms_val.json
—— 验证用帧信息(可选) -
transforms_test.json
—— 测试用帧信息(可选)
每个 JSON 文件结构类似,包含以下关键信息:
-
camera_angle_x
:相机水平方向视角(弧度) -
frames
:数组,每个元素代表一帧图像信息,包含图像路径和相机位姿矩阵(4x4变换矩阵)
二、如何用 COLMAP 生成 Blender 格式数据集
详细的可见:
用 COLMAP GUI 在 Windows 下一步步完成 相机位姿估计(SfM) 和 稀疏点云重建的详细步骤:-CSDN博客
1. 运行 COLMAP 稀疏重建(SfM)
-
打开 COLMAP GUI
-
新建项目,导入图片
-
运行 Feature Extraction 和 Feature Matching
-
运行 Sparse Reconstruction(SfM)
-
SfM 完成后,
sparse/0/
目录下会生成cameras.txt
、images.txt
、points3D.txt
三个文件
这些文本文件中包含相机内参(焦距、畸变等)、相机外参(旋转、平移)和三维点信息。
或者使用命令行完成以上步骤:
colmap feature_extractor --database_path database.db --image_path ./images
colmap exhaustive_matcher --database_path database.db
mkdir sparse
colmap mapper --database_path database.db --image_path ./images --output_path sparse
sparse/0
文件夹下会有 cameras.txt
(内参),images.txt
(位姿)和 points3D.txt
2. 解析 COLMAP 导出的文件,生成 Blender 格式的 JSON 文件
-
内参信息一般在
cameras.txt
中:-
焦距 (focal length)
-
主点 (cx, cy)
-
图像尺寸(宽、高)
-
-
外参在
images.txt
中:-
每张图的旋转四元数 + 平移向量
-
需转换为 4x4 的相机变换矩阵(world-to-camera 或 camera-to-world)
-
COLMAP 坐标系是右手坐标系,Nerf / Blender 格式使用的坐标系和矩阵定义和 COLMAP 有差异,需要做转换:
-
COLMAP 的旋转是图像到世界坐标的变换(或者相反,需看具体定义)
-
Nerf 需要的是相机到世界(camera-to-world)4x4矩阵
-
通常需要对旋转矩阵和位移向量做转置和坐标轴调整(比如 z 轴正方向)
生成的 transforms_train.json
结构示例:
{"camera_angle_x": 0.6911112070083618, // 水平视场角,单位弧度"frames": [{"file_path": "./train/r_0", // 图片相对路径(不带后缀)"rotation": 0.012566370614359171, <--- 额外字段,可能是额外角度信息"transform_matrix": [ // 4x4相机变换矩阵,表示从世界坐标到相机坐标的变换[-0.9250140190124512,0.2748899757862091,-0.2622683644294739,-1.0572376251220703],[-0.3799331784248352,-0.6692678928375244,