【问题标题】:3D transformation matrix from two vectors来自两个向量的 3D 变换矩阵
【发布时间】:2015-12-23 14:14:26
【问题描述】:

我在两个坐标系中有一对 3D 点,我需要找到坐标系之间的变换矩阵(旋转、缩放、平移)。

例如两点
p0 = (x0,y0,z0)
p1 = (x1,y1,z1)

对应于另一个坐标系中的点:
q0 = (x0', y0', z0')
q1 = (x1', y1', z1')

我需要找到变换 M (R|T) 使得
q0 = M * p0
q1 = M * p1

如果有使用 opencv 或 python 的简单方法,那就太好了。

【问题讨论】:

  • 您至少需要 3 个点的协同响应。如果我没记错的话,一种解决方案是使用“直接线性变换”。
  • 一般来说,您使用齐次坐标,以便将旋转和平移嵌入到 4x4 线性变换矩阵中。只需求解对应点之间的线性方程即可。
  • 对于 3D 中的一般仿射变换,您需要 4 个非平面点(4 对)。转换有什么限制吗?
  • @MBo 3D 摄像机运动是一种刚性变换,3dof 用于旋转,3dof 用于平移。想一想,2点对(3d) -> 6个线性方程应该够了吧?
  • @Micka 考虑 3 对 (0,0,0),(1,0,0),(0,1,0)=>(0,0,0),(0,0 ,1),(0,1,0)。一种可能的仿射变换是绕 Y 轴旋转 Pi/2。它将点 (0,0,1) 映射到 (-1,0,0)。另一种可能的仿射变换 - 相同的旋转,然后沿 X 轴缩放 -1(或任何因子)。它将同一点 (0,0,1) 映射到 (+1,0,0)。

标签: python opencv math geometry


【解决方案1】:

我们可以这样解释您的问题。你想找到一个矩阵 M 使得

    for matrix P = [p1 p2] and Q = [q1 q2], Q = MP. 

然后我们可以求解 M:

    M = Q.dot(numpy.linalg.pinv(P))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    • 2016-08-08
    • 2011-01-07
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    相关资源
    最近更新 更多