如何在Blender中可视化Colmap导出的images.txt相机位姿
你遇到的旋转错误是两个核心原因导致的:
- Colmap和Blender的相机坐标系定义不匹配,没有做坐标系转换
- 欧拉角的旋转顺序、旋向匹配错误,用四元数赋值可以避免这类问题
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
相关产品推荐
相关产品推荐

