我在一个投影空间中有一组三维点,我想把它们转换成一个公制的三维空间,这样我就可以用米来测量距离。
为此,我需要3D到3D的单应性,它是一个具有15个自由度的4x4矩阵(因此我需要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是对应于3D度量空间中的1,1,0,1的X,Y,Z,1点,依此类推。然而,这是不正确的,因为我是在射影空间中,所以我需要创建一个方程式集,在这里我将H的行除以它的最后一行或类似的东西。
我想也许有一个实现的方法可以为我做到这一点,例如在opencv中,但没有找到。任何帮助都将不胜感激。
发布于 2018-09-23 12:54:19
我终于和一个朋友解决了这个问题,并愿意分享这个解决方案。
因为在射影空间中,一个人需要求解一个方程组,其中结果的同源坐标是彼此坐标的分母。也就是说,如果你想找到一个4x4单应矩阵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个匹配点。问题中的方法是好的(只是没有解决正确的问题),在这些方面,它将进行Ax=b最小二乘优化,使得A是15x15矩阵,b是15维向量。每个匹配点生成3个方程,然后5个匹配点将生成15个内置到矩阵A中的方程,从而求解3D单应性H的15个自由度。
https://stackoverflow.com/questions/52081318
复制相似问题