我试图实现Hartley&Zisserman的"Multiple View Geometry"(第12.2节)中的(相对简单的)线性齐次(DLT)3D三角测量方法,目的是在未来实现它们的全部,"optimal algorithm" . 现在,基于this question,我试图让它在Matlab中运行,稍后将其移植到C和OpenCV中,测试整合过程中的符合性 .
问题是我不确定如何使用我拥有的数据 . 我已经校准了我的立体装备,并获得了两个内在的相机矩阵,两个失真系数向量,与两个相机相关的旋转矩阵和平移向量,以及基本矩阵和基本矩阵 . 我还具有两个点的2D坐标,这两个点应该是两个图像的坐标系中的单个3D点的对应关系(分别由第一和第二相机拍摄) .
该算法将两个点坐标和两个4×3“相机矩阵”P和P'作为输入 . 这些显然不是从校准中获得的固有相机矩阵(M,M'),因为对于它们来说它们是3x3,并且因为仅使用它们的投影将3D点放在两个不同的坐标系中,即 - 外在的(旋转/翻译)数据丢失 .
H&Z书包含有关使用SVD分解从基本矩阵或基本矩阵恢复所需矩阵的信息(第9章),但有其自身的其他问题(例如比例模糊) . 我觉得我不需要那个,因为我有明确定义的旋转和翻译 .
那么问题是:使用第一个内在矩阵是否正确,使用额外的零列作为第一个“相机矩阵”(P = [M | 0]),然后将第二个内在矩阵乘以外部矩阵由旋转矩阵和平移向量作为额外列组成,以获得第二个所需的“相机矩阵”(P'= M'* [R | t])?或者它应该以不同的方式完成?
谢谢!
1 回答
我手头没有我的H&Z - 但是他们关于这个主题的旧CVPR教程是here(对于其他任何人来看看这个问题的w.r.t) .
为了清楚(并使用它们的术语),投影矩阵P从欧几里德3空间点(X)映射到图像点(x),如下所示:
哪里:
由(3×3)摄像机校准矩阵K和(3×3)旋转矩阵R和平移矢量(3×1)t定义 .
事情的关键似乎是如何使用你的两个相机P和P'进行三角测量 .
我相信你提议世界起源位于第一台摄像机P,因此:
和
然后我们在基础矩阵F中寻求重建,以便:
矩阵F当然可以通过多种方式计算(有时更常见的是来自未校准的图像!)但是在这里我想你可能想要根据你已经校准过的相机矩阵来做到这一点:
其中
C = (0 1)
是第一个摄像机的中心,pinv(P)
是P的伪逆._x
表示文献中用于矩阵乘法的符号来计算矢量乘积 .然后,您可以执行基本矩阵F的分解(通过SVD或直接方法执行) .
因此,正如您正确陈述的那样,我们可以直接根据以下方式计算三角测量:
和
使用这些进行三角测量应该相对简单(假设校准良好,没有噪音等)