在一个校准好的立体视觉设备中,如何获取实现3D三角测量算法所需的“相机矩阵”?

6
我正在尝试实现 Hartley & Zisserman 的《多视角几何》(第12.2节)中相对简单的线性齐次(DLT)3D三角测量方法,旨在未来实现他们的完整“最优算法”。目前,基于this question,我正在尝试在Matlab中让它正常工作,并将其移植到C++和OpenCV中,在此过程中进行一致性测试。
问题是我不确定如何使用我拥有的数据。我已经校准了我的立体相机组,并获得了两个内部相机矩阵,两个畸变系数向量,关联两个相机的旋转矩阵和平移向量,以及本质矩阵和基础矩阵。我还有两个点的2D坐标,这些点应该是两张图像中单个3D点的对应物(分别由第一个和第二个相机拍摄)。
该算法的输入为两个点坐标和两个4x3的“相机矩阵”P和P'。这些明显不是从校准中获得的内在相机矩阵(M,M'),因为首先它们是3x3的,而且仅使用它们进行投影会将3D点放置在两个不同的坐标系中,即-缺少外在(旋转/平移)数据。
H&Z书籍包含有关从基本矩阵或本质矩阵中使用SVD分解恢复所需矩阵的信息(第9章),但还存在其他问题(例如,比例歧义)。我觉得我不需要那个,因为我已经明确定义了旋转和平移。
问题是:是否应该使用第一个内在矩阵,作为第一个“相机矩阵”的额外列为零(P = [M | 0]),然后将第二个内在矩阵乘以由旋转矩阵和平移向量组成的外在矩阵作为额外列以获得第二个所需的“相机矩阵”(P'=M'*[R|t])?还是应该用其他方法?
谢谢!
1个回答

11
我没有H&Z在手边-但是他们关于这个主题的旧CVPR教程在这里(供其他人查看有关此问题的内容)。
为了明确起见(并使用他们的术语),投影矩阵P将从欧几里得3空间点(X)映射到图像点(x):
x = PX

其中:

P = K[ R | t ]

这涉及到由(3x3)相机校准矩阵K、(3x3)旋转矩阵R和(3x1)平移向量t定义的问题。

关键在于如何使用两个相机P和P'执行三角测量。

我认为您是建议将世界原点定位在第一个相机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)表示第一台相机的中心点,pinv(P)表示P的伪逆。在矩阵乘法中计算向量积时,_x表示文献中使用的符号。

然后可以通过SVD或直接方法对基础矩阵F进行分解。

F = [t]_x M

因此,正如你正确提出的那样,我们可以根据以下内容直接计算三角测量:

P = [ I | 0 ] 

并且

P' = [ M | t ]

使用这些工具执行三角化应该相对容易(假设校准良好,没有噪音等等)。

谢谢,没错,我已经成功地让它工作了。除了一个问题,就是在这种情况下我无法享受没有噪音的奢侈条件,三角定位并不容易,但幸运的是H&Z解决了这个问题。 :) - neuviemeporte

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