SciPy Rotation矩阵转四元数再转回矩阵与输入不一致
问题根因
scipy.spatial.transform.Rotation 的所有矩阵相关接口,仅支持处理符合SO(3)约束的合法3D旋转矩阵,你传入的相机内参矩阵根本不是旋转矩阵,输入环节就不符合API要求,结果自然对不上。
合法旋转矩阵必须同时满足两个硬性要求:
- 属于正交矩阵:矩阵转置和自身相乘等于3阶单位矩阵,即
R @ R.T = np.eye(3) - 矩阵行列式值为1
你用的相机内参是典型的上三角透视投影矩阵,对角线元素是相机焦距(fx≈503.58、fy≈499.79),第三列存储成像主点坐标,计算下来行列式值约为251650,远不等于1,完全不满足旋转矩阵的约束。Rotation.from_matrix 不会拦截非法输入,只会强行把传入的矩阵投影到距离最近的合法SO(3)旋转矩阵上再做后续计算,你后续转四元数、再转回矩阵拿到的结果,本质是这个投影生成的近似旋转矩阵,和你原始传入的内参矩阵没有对应关系。
使用注意事项
- 旋转矩阵、四元数、欧拉角、旋转向量这几种表示的互转逻辑,仅适用于相机外参里的纯旋转部分3x3正交矩阵,不能传入相机内参、带缩放/仿射/投影属性的矩阵。
- 相机内参是透视投影变换参数,不存在对应的单位四元数表示,不能用Rotation类处理。
内容的提问来源于stack exchange,提问作者adroit.levees.0r
相关产品推荐
相关产品推荐

