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

时间:2018-08-29 15:36:56

标签: python numpy opencv computer-vision

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

为此,我需要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是[X,Y,Z,1]点,它对应于3D度量空间中的[1,1,0,1]等。 但是,这是不正确的,因为我在投影空间中,因此我需要以某种方式创建一个方程组,在该方程组中,我将H的行除以最后一行或类似的内容。

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

1 个答案:

答案 0 :(得分:1)

我终于和一个朋友解决了这个问题,并希望分享解决方案。

由于在射影空间中,需要求解一个方程组,其中结果的同质坐标是彼此坐标的分母。即,如果要查找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

在数学上,优化基于此(为了简单起见,此优化仅集中在第一个坐标上,但其他坐标也以相同的方式完成): mathematical explanation of the optimization for the first coordinate

因此在python中,需要以所说明的方式为求解器排列方程,并带有5个匹配点。这个问题的目的是好的(只是没有解决正确的问题),按照这些术语,它将使Ax = b最小二乘优化,使得A为15x15矩阵,b为15维向量。 每个匹配点生成3个等式,然后5个匹配点将生成15个建立在矩阵A中的等式,从而求解3D单应H的15个自由度。