6

我正在尝试实现 Hartley & Zisserman 的“多视图几何”(第 12.2 节)中的(相对简单的)线性齐次 (DLT) 3D 三角测量方法,目的是在未来实现其完整的“最优算法”。现在,基于这个问题,我正试图让它在 Matlab 中工作,然后将其移植到 C++ 和 OpenCV 中,并在此过程中测试一致性。

问题是我不确定如何使用我拥有的数据。我已经校准了我的立体装置,并获得了两个固有相机矩阵、两个失真系数向量、两个相机相关的旋转矩阵和平移向量,以及基本矩阵和基本矩阵。我还有两个点的 2D 坐标,它们应该是两个图像坐标系中单个 3D 点的对应关系(分别由第一个和第二个相机拍摄)。

该算法将两个点坐标和两个 4x3“相机矩阵”P 和 P' 作为输入。这些显然不是从校准中获得的内在相机矩阵 (M, M'),因为它们是 3x3,而且因为单独使用它们的投影将 3D 点放在两个不同的坐标系中,即 - 外在 (旋转/平移)数据丢失。

H&Z 书包含有关使用 SVD 分解从基本矩阵或基本矩阵中恢复所需矩阵的信息(第 9 章),但也有其自身的其他问题(例如尺度模糊)。我觉得我不需要那个,因为我明确定义了旋转和平移。

那么问题是:使用第一个内在矩阵是否正确,将额外的零列作为第一个“相机矩阵”(P = [M | 0]),然后将第二个内在矩阵乘以一个外在矩阵由旋转矩阵和平移向量组成作为额外的列,以获得第二个所需的“相机矩阵”(P'=M'*[R|t])?还是应该以不同的方式完成?

谢谢!

4

1 回答 1

11

我手头没有 H&Z - 但是他们关于这个主题的旧 CVPR 教程在这里(其他人可以看看这个问题)。

为清楚起见(并使用他们的术语),投影矩阵P从欧几里得 3 空间点 ( X ) 映射到图像点 ( x ) 为:

x = PX

在哪里:

P = K[ R | t ]

由 (3x3) 相机校准矩阵K和 (3x3) 旋转矩阵R和平移向量 (3x1) t定义。

问题的关键似乎是如何使用您的两个相机PP'执行三角测量。

我相信您建议世界原点位于第一台相机P,因此:

P = K [ I | 0]

P' = K' [ R | t ]

然后我们在基本矩阵 F 中寻求重建,使得:

x' F x = 0

矩阵F当然可以通过多种方式计算(有时更常见于未校准的图像!)但在这里我认为您可能希望根据上面已经校准的相机矩阵来执行此操作:

F = [P' C]_x P' pinv(P)

哪里C = (0 1)是第一个相机的中心,是Ppinv(P)的伪逆。表示文献中用于矩阵乘法计算向量积的符号。_x

然后,您可以执行基本矩阵 F 的分解(通过 SVD 或直接方法执行)。

F = [t]_x M

因此,正如您正确指出的那样,我们可以直接根据以下公式计算三角剖分:

P = [ I | 0 ] 

P' = [ M | t ]

使用这些来执行三角测量应该相对简单(假设校准良好、没有噪音等)

于 2012-05-09T15:28:49.793 回答