首页 > 解决方案 > 用 5 个 3D 点计算 3D 单应性

问题描述

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

为此,我需要一个 3D 到 3D 单应性,它是一个 4x4 矩阵,具有 15 个自由度(所以我需要 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 中,但没有找到。任何帮助,将不胜感激。

标签: pythonnumpyopencvcomputer-vision

解决方案


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

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


推荐阅读