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

如何在Blender中可视化Colmap导出的images.txt相机位姿

你遇到的旋转错误是两个核心原因导致的:

  1. Colmap和Blender的相机坐标系定义不匹配,没有做坐标系转换
  2. 欧拉角的旋转顺序、旋向匹配错误,用四元数赋值可以避免这类问题

1. 调整坐标系转换逻辑

Colmap采用计算机视觉常用相机坐标系:朝向+Z轴,向右+X,向下+Y;Blender采用计算机图形学常用相机坐标系:朝向-Z轴,向右+X,向上+Y,需要额外加校正矩阵适配。
找到代码中rotation_matrix = qvec2rotmat([qw, qx, qy, qz])的位置,在后面添加如下代码:

# 校正矩阵:将Colmap相机坐标系转换为Blender相机坐标系
cv2blender = np.array([
    [1, 0, 0],
    [0, -1, 0],
    [0, 0, -1]
])
# 计算Blender下的相机到世界旋转矩阵
blender_rot = rotation_matrix.T @ cv2blender

你计算的光心位置optical_center = -rotation_matrix.T @ np.array([tx, ty, tz])逻辑正确,不需要修改。

2. 改用四元数赋值避免欧拉角错误

欧拉角涉及旋转顺序、旋向的匹配,很容易出错,直接用四元数给Blender相机赋值即可,不需要转欧拉角。
把原来转换欧拉角的代码替换为:

# 从Blender旋转矩阵直接转四元数
_qw, _qx, _qy, _qz = rotmat2qvec(blender_rot)

然后修改生成Blender脚本的部分,改用四元数设置旋转:

blender_script = f"camera_data{index} = bpy.data.cameras.new(name='{name}')\n" \
                 f"camera_object{index} = bpy.data.objects.new('{name}', camera_data{index})\n" \
                 f"bpy.context.scene.collection.objects.link(camera_object{index})\n" \
                 f"camera_object{index}.location = ({tx}, {ty}, {tz})\n" \
                 f"camera_object{index}.rotation_mode = 'QUATERNION'\n" \
                 f"camera_object{index}.rotation_quaternion = ({_qw}, {_qx}, {_qy}, {_qz})\n" \
                 f"bpy.data.cameras['{name}'].lens = 30\n\n"

3. 修复文件读取的小问题

你当前的行判断条件line.endswith('.png') or line.endswith('jpg')会漏读大写后缀的图片(比如示例中的.JPG),修改为:

if not line.startswith('#') and line.lower().endswith(('.png', '.jpg', '.jpeg')):

修改完成后重新运行脚本,生成的位姿导入Blender就和Colmap的位姿一致了。如果整体场景有轴向偏移,可以再给所有相机的位置和旋转加一个全局的世界坐标系转换即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 23:06:03