You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DTU数据集转COLMAP格式适配3DGS失败问题求助

DTU转COLMAP格式的核心问题与修复方案

核心错误点

  1. 矩阵变换顺序混淆:错误将world_mat @ scale_mat整体作为投影矩阵分解,未遵循DTU的world_mat=内参K×外参(世界→相机)的定义,且缩放矩阵的应用顺序错误。
  2. OpenCV分解的坐标系差异:decomposeProjectionMatrix输出的是相机→世界的变换参数,而COLMAP需要的是世界→相机的变换参数。
  3. 四元数顺序错误:Scipy生成的四元数顺序与COLMAP要求的顺序不一致,直接使用会导致旋转姿态完全错误。

正确转换代码

import numpy as np
import cv2
from scipy.spatial.transform import Rotation

# 加载DTU单帧的world_mat和scale_mat(均为4x4齐次矩阵)
world_mat = np.load("path/to/world_mat.npy")
scale_mat = np.load("path/to/scale_mat.npy")

# 1. 提取原始世界→相机的外参(world_mat = K * [R_w2c | t_w2c])
# 分解world_mat前3行4列,得到内参K和相机→世界的临时R、t(注意OpenCV的输出特性)
K, R_c2w, t_c2w = cv2.decomposeProjectionMatrix(world_mat[:3, :])[:3]
# 归一化内参(去除OpenCV分解引入的缩放因子)
K = K / K[2, 2]
fx, fy, cx, cy = K[0, 0], K[1, 1], K[0, 2], K[1, 2]

# 2. 转换为世界→相机的旋转矩阵
R_w2c = R_c2w.T  # 相机→世界的旋转矩阵的转置,即为世界→相机的旋转矩阵

# 3. 应用scale_mat的场景缩放
# scale_mat作用:将世界坐标缩放至单位球,需先对世界点应用缩放,再转相机坐标
scaled_R_w2c = R_w2c @ scale_mat[:3, :3]
scaled_t_w2c = world_mat[:3, 3] + R_w2c @ scale_mat[:3, 3]

# 4. 转换为COLMAP要求的四元数(注意顺序:COLMAP是qw, qx, qy, qz;Scipy是x,y,z,w)
q = Rotation.from_matrix(scaled_R_w2c).as_quat()
qw, qx, qy, qz = q[3], q[0], q[1], q[2]

# 5. COLMAP格式的平移向量(世界原点在相机坐标系中的位置,即scaled_t_w2c)
tx, ty, tz = scaled_t_w2c[0], scaled_t_w2c[1], scaled_t_w2c[2]

COLMAP文件格式验证

  • cameras.txt:使用PINHOLE相机模型,每行格式为:
    CAMERA_ID MODEL WIDTH HEIGHT PARAMS
    
    示例:
    1 PINHOLE 1600 1200 {fx} {fy} {cx} {cy}
    
  • images.txt:每行格式为(注意四元数顺序和参数顺序):
    IMAGE_ID QW QX QY QZ TX TY TZ CAMERA_ID IMAGE_NAME
    
    示例:
    1 {qw} {qx} {qy} {qz} {tx} {ty} {tz} 1 image_0001.jpg
    

额外验证步骤

  • 用COLMAP GUI加载生成的稀疏模型,检查相机姿态是否围绕场景均匀分布,若相机朝向混乱则说明旋转参数仍有问题。
  • 对比DTU官方内参值,确保fx、fy、cx、cy与官方数据一致。
  • 确保所有图像路径正确,COLMAP能正常读取图像特征。

内容的提问来源于stack exchange,提问作者user27519684

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 21:35:11