相机外参

opencv<-->opengl

参考链接:https://github.com/mmatl/pyrender/issues/228

首先需要确定当前外参是w2c还是c2w,一般数据集中提供的都是w2c矩阵,因为这个矩阵是用于将世界坐标系的网格投影到相机坐标系中。

确定好了是w2c之后,由于opencv和opengl的y轴和z轴的方向是相反的,因此只需要将对应坐标轴反过来即可。

方法一:
camera_pose[[1, 2]] *= -1

方法二:
F = torch.diag(torch.tensor([1., -1., -1.], device=R_gl.device))
R_cv = F @ R_gl        # 左乘 = 翻行
t_cv = F @ t_gl        # 同时翻平移

opencv-->pytorch3d

参考链接:https://github.com/facebookresearch/pytorch3d/issues/522

可以看到pytorch3d的相机坐标系和opencv,opengl都不一样,因此需要额外转换。但是pytorch3d中提供了很方便的函数,可以直接基于opencv相机参数构建透视相机。

cameras_p3d = pytorch3d.utils.cameras_from_opencv_projection(
    R_tensor[None],
    T_tensor[None],
    K_tensor[None],
    torch.tensor([[TARGET_SIZE, TARGET_SIZE]], dtype=torch.float32, device=device)
)
R_tensor = cameras_p3d.R[0]
T_tensor = cameras_p3d.T[0]

注意

相机的位移参数T需要注意一下单位对不对,是以毫米为单位还是以米为单位,有时候需要乘以或者除以1000。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐