如何从旋转和位置获得变换矩阵

问题描述 投票:0回答:1

我想知道如何从旋转和位置矩阵得到变换矩阵

我有一个高斯泼溅训练数据(

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]]))

但这似乎是错误的。

3d rotation position transform gaussian
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]]
(例如,请参阅此处了解此公式)。

© www.soinside.com 2019 - 2024. All rights reserved.