利用标定后的相机得到匹配点进行三维重建



我正在尝试从几对两个视点计算3D坐标。
首先,我使用matlab函数estimateFundamentalMatrix()来获得匹配点(Number> 8)的F,即:

F1 =[-0.000000221102386   0.000000127212463  -0.003908602702784
     -0.000000703461004  -0.000000008125894  -0.010618266198273
      0.003811584026121   0.012887141181108   0.999845683961494]

我的相机——拍了这两张照片——用固有矩阵预先校准:

K = [12636.6659110566, 0, 2541.60550098958
     0, 12643.3249022486, 1952.06628069233
     0, 0, 1]

从这个信息,我然后计算基本矩阵使用:

E = K'*F*K

通过SVD的方法,我最终得到了投影变换矩阵:

P1 = K*[ I | 0 ] 

P2 = K*[ R | t ]

其中Rt分别为:

R = [ 0.657061402787646 -0.419110137500056  -0.626591577992727
     -0.352566614260743 -0.905543541110692   0.235982367268031
     -0.666308558758964  0.0658603659069099 -0.742761951588233]
t = [-0.940150699101422
      0.320030970080146
      0.117033504470591]

我知道应该有4种可能的解决方案,但是,我计算的3D坐标似乎不正确。
我用相机拍摄了一个带有标记点的平面物体。我手工匹配了点(这意味着原材料不应该有明显的错误)。但结果是一个有一点点带状的表面。我想这可能是由于照片没有经过失真处理(但实际上我记得我做过)。

我只是想知道这种方法解决三维重建问题是否正确?特别是当我们已经知道了相机的固有矩阵。

我已经重做了这个过程,并得到了一些显示问题的图片,我会详细地写另一个问题,然后发布链接。

编辑JCraft at Aug.4:我发布了一个新问题:校准相机得到匹配点进行3D重建,理想测试失败。@Schorsch非常感谢你帮助整理我的问题。我将努力学习如何在SO中做输入,并努力提高我的语法。谢谢!

如果你只有基本矩阵和固有矩阵,你只能得到一个按比例重建。平移向量t的单位是未知的。您可以通过以下几种方式以实际单位获得3D点:

  • 你需要在世界上有一些参考点,它们之间的距离已知。这样你就可以在未知单位中计算它们的坐标,并计算比例因子将未知单位转换为实际单位。
  • 你需要知道每个相机的外部相对于一个共同的坐标系。例如,你可以在场景的某个地方有一个棋盘校准模式,你可以从中检测和计算外部元素。请看这个例子。顺便说一下,如果你知道外部性,你可以直接计算基本矩阵和相机投影矩阵,而不必匹配点。
  • 你可以做立体校准来估计相机之间的R和t,这也会给你基本和基本矩阵。

平面对象是关键的表面,不可能从它们实现您的目标。尝试在平面外添加两个(或更多)点(如果仍然感兴趣,请参阅Hartley和Zisserman或其他关于此问题的文本)

最新更新