【发布时间】: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