我正在努力实现Hartley& Co.的(相对简单的)线性齐次(DLT)3D三角测量方法。 Zisserman的“多视图几何”(第12.2节),旨在实现他们未来的完整“最佳算法”。现在,基于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])?或者应该以不同的方式完成?
谢谢!
答案 0 :(得分:10)
我手头没有我的H& Z,但他们关于这个主题的旧CVPR教程是here(其他任何人都可以看看这个问题)。
为了清晰(并使用他们的术语),投影矩阵 P 从欧几里德3空间点( X )映射到图像点( x )as:
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
表示文献中用于矩阵乘法的符号来计算向量乘积。
然后,您可以执行基本矩阵F的分解(通过SVD或直接方法执行)。
F = [t]_x M
因此,正如您所说,我们可以根据以下内容直接计算三角测量:
P = [ I | 0 ]
和
P' = [ M | t ]
使用这些来进行三角测量应该相对简单(假设校准良好,没有噪音等等)。