python – 用5个3D点计算3D单应性

我在投影空间中有一组3D点,我想将它们转换为公制3D空间,以便我可以用米来测量距离.

为了做到这一点,我需要一个3D到3D的单应性,这是一个具有15个自由度的4×4矩阵(所以我需要5个3D点来获得15个方程).
我有一组来自投影空间的这5个3D点,以及它们在度量空间中对齐的5个3D点(我希望将5个投影点转换为).

我无法弄清楚如何估计单应矩阵.起初我尝试过:

A=np.vstack([p1101.T, p1111.T, p0101.T, p0001.T, p0011.T])
b=np.array([[1,1,0,1], [1,1,1,1], [0,1,0,1], [0,0,0,1], [0,0,1,1]])
x, _, _, _ = np.linalg.lstsq(A,b)
H = x.T

其中p1101是[X,Y,Z,1]点,对应于3D度量空间中的[1,1,0,1]等.
然而,这是不正确的,因为我在射影空间中,所以我需要以某种方式创建一个方程组,其中我将H的行与其最后或类似的东西分开.

我想也许有一个实现的方法可以为我做,例如在opencv中,但没有找到.任何帮助,将不胜感激.

最佳答案 我终于和朋友解决了这个问题,并希望分享解决方案.

因为在投影空间中,需要求解方程组,其中结果的同质坐标是每个其他坐标的分母.也就是说,如果你想找到一个4×4单应矩阵H,并且你有匹配的3D点x和b(b在米的空间中),你需要优化H参数的搜索,这样在x上应用的H就会给出具有4个坐标的向量v,使得v的所有前三个坐标除以最后一个坐标是b.用numpy写的:

v = H.dot(x)
v = v[:3]/v[3]
v == b  # True

在数学上,优化是基于此(为了简单起见,这仅关注第一个坐标,但其他坐标以相同的方式完成):
《python – 用5个3D点计算3D单应性》

因此在python中,需要以解释的方式排列求解器的方程,具有5个匹配点.问题中的目的是好的(只是没有解决正确的问题),并且在这些术语中它将使Ax = b最小二乘优化,使得A是15×15矩阵,并且b是15维向量.
每个匹配点生成3个方程,然后5个匹配点将生成内置于矩阵A中的15个方程,从而求解3D单应性H的15 DOF.

点赞