使用五个三维点计算三维单应性。

4
我有一组在投影空间里的三维点,我想将它们转换为度量制的三维空间,这样我就可以用米来测量距离。
为了达到这个目的,我需要一个三维到三维的单应性矩阵,它是一个具有15个自由度的4x4矩阵(所以我需要5个三维点来获得15个方程)。
我有一组这样的5个投影空间中的三维点和它们对应的5个度量空间中对齐的三维点(我期望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中,但没有找到。任何帮助将不胜感激。

1个回答

1
我最终与朋友一起解决了这个问题,并想分享解决方法。由于在投影空间中,需要解决一个方程组,其中结果的齐次坐标是其他坐标的分母。即,如果您想要找到一个4x4的单应矩阵H,并且您有匹配的3D点x和b(b在米制空间中),则需要优化搜索H参数,使得H应用于x将给出一个具有4个坐标的向量v,使得v的前三个坐标除以最后一个坐标均为b。numpy写成:
v = H.dot(x)
v = v[:3]/v[3]
v == b  # True

数学上,优化是基于以下内容的(为简单起见,这仅关注第一个坐标,但其他坐标也以同样的方式完成): 第一个坐标优化的数学解释 因此,在Python中,需要按照所述方式为求解器排列方程,并使用5个匹配点。在问题中提出的方法很好(只是没有解决正确的问题),并且在这些术语中,它将使得Ax=b最小二乘优化,其中A是15x15矩阵,b是15维向量。 每个匹配点生成3个方程式,然后5个匹配点将产生15个方程式,构建成矩阵A,从而解决3D单应性H的15 DOF。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接