我想知道如何从旋转和位置矩阵得到变换矩阵
我有一个高斯泼溅训练数据(
cameras.json
):
{
"id": 0,
"img_name": "_DSC9040",
"width": 5025,
"height": 3312,
"position": [-0.044550560003616964, 1.4236172811064225, 2.92660596573917],
"rotation": [
[-0.9982609640488053, -0.010911420501731176, 0.057930894684822855],
[-0.023242959401519592, 0.9759623621223222, -0.2166961756904737],
[-0.054173909722383416, -0.21766581868371465, -0.974518742191313]
],
"fy": 4285.457130435278,
"fx": 4328.590804346088
}
我尝试定义:
transform_matrix = [[-0.9982609640488053, -0.010911420501731176, 0.057930894684822855, -0.044550560003616964],
[-0.023242959401519592, 0.9759623621223222, -0.2166961756904737, 1.4236172811064225],
[-0.054173909722383416, -0.21766581868371465, -0.974518742191313, 2.92660596573917],
[0.0, 0.0, 0.0, 1.0]]))
但这似乎是错误的。
变换矩阵由旋转矩阵
R
(json 中的“旋转”)和平移向量 t
(json 中的“位置”)组成。当您将它们堆叠在一起时,就像您所做的那样,在一个 [R | t]
4x3 矩阵中,并附加第四行 [0,0,0,1]
,您将得到 4x4 变换矩阵(让我们用 T
表示它)。当这个矩阵乘以齐次向量h = [x, y, z, 1].T
时,结果是齐次向量h' = [x', y', z', 1].T
,对应于执行非齐次操作[x', y', z'].T = R*[x, y, z].T + t
。
现在,这种变换通常有两种可能的含义。它可以是:
(1) 将
camera坐标中的向量
h
转换为 world坐标中的向量
h'
。
(2)
world坐标中的向量
h
到 camera坐标中的向量
h'
的逆变换。
这可能会令人困惑,因此某些文本(和代码)实际上明确地写了
T_c2w
或 T_w2c
(对应于上面的 1 和 2)。
不管怎样,从你的 t 向量的命名“位置”来看,我怀疑它是相机在世界上的位置。这意味着您的转换可能对应于上面的选项 (1)。为什么?一个简单的经验法则是查看对原始向量 [0, 0, 0, 1].T
应用变换的效果(即将其乘以变换矩阵)。这会重建“位置”向量,因此如果“位置”确实表示相机在世界中的位置,那么您可以将相机的原点放在 camera 坐标中,并将其转换为 world 坐标(因此为 (1))。
我怀疑你感兴趣的是(2)。为了从矩阵
T
中获得与 (2) 相对应的变换矩阵,您可以将其反转(例如,使用 python 的 numpy.linalg.inv(T)
)或使用显式公式
T_inv = [[R.T | -R.T*t], [0,0,0,1]]
(例如,请参阅此处了解此公式)。