在校准的立体视觉装备中,如何获得实现3D三角测量算法所需的"相机矩阵"?

neu*_*rte 6 linear-algebra computer-vision triangulation stereo-3d camera-calibration

我试图实现Hartley&Zisserman的"多视图几何"(第12.2节)中的(相对简单的)线性齐次(DLT)3D三角测量方法,目的是在未来实现其完整的"最优算法".现在,基于这个问题,我试图让它在Matlab中运行,然后将其移植到C++和OpenCV中,一路上测试符合性.

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

该算法将两个点坐标和两个4×3"相机矩阵"P和P'作为输入.这些显然不是从校准中获得的固有相机矩阵(M,M'),因为对于它们来说它们是3x3,并且因为仅使用它们的投影将3D点放在两个不同的坐标系中,即 - 外在的(旋转/翻译)数据丢失.

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

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

谢谢!

til*_*uki 11

我没有我的H&Z手 - 但他们关于这个主题的旧CVPR教程就在这里(对于其他任何人来看看这个问题).

为了清楚(并使用它们的术语),投影矩阵P从欧几里德3空间点(X)映射到图像点(x),如下所示:

x = PX
Run Code Online (Sandbox Code Playgroud)

哪里:

P = K[ R | t ]
Run Code Online (Sandbox Code Playgroud)

由(3×3)摄像机校准矩阵K和(3×3)旋转矩阵R和平移矢量(3×1 )t定义.

事情的关键似乎是如何使用你的两个相机PP'进行三角测量.

我相信你提议世界起源位于第一台摄像机P,因此:

P = K [ I | 0]
Run Code Online (Sandbox Code Playgroud)

P' = K' [ R | t ]
Run Code Online (Sandbox Code Playgroud)

然后我们在基础矩阵F中寻求重建,以便:

x' F x = 0
Run Code Online (Sandbox Code Playgroud)

矩阵F当然可以通过多种方式计算(有时更常见的是来自未校准的图像!)但是在这里我想你可能想要根据你已经校准过的相机矩阵来做到这一点:

F = [P' C]_x P' pinv(P)
Run Code Online (Sandbox Code Playgroud)

C = (0 1)第一台摄像机的中心在哪里,是Ppinv(P)的伪逆.这表示文献中用于矩阵乘法的符号来计算矢量积._x

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

F = [t]_x M
Run Code Online (Sandbox Code Playgroud)

因此,正如您正确陈述的那样,我们可以直接根据以下方式计算三角测量:

P = [ I | 0 ] 
Run Code Online (Sandbox Code Playgroud)

P' = [ M | t ]
Run Code Online (Sandbox Code Playgroud)

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