【问题标题】:Use calibrated camera get matched points for 3D reconstruction使用校准的相机获取匹配点进行 3D 重建
【发布时间】:2014-07-31 08:58:27
【问题描述】:

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

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 坐标似乎不正确。
我用相机拍摄了带有标记点的平面物体的照片。我手动匹配了点(这意味着原材料不应该存在明显的错误)。但结果证明是一个带有一点条纹的表面。
我想这可能是因为图片没有进行失真处理(但实际上我记得我做过)。

我只是想知道这个方法能不能解决3D重建问题对吗?尤其是当我们已经知道相机内在矩阵时。

8 月 4 日由 JCraft 编辑:我已经重做了这个过程并得到了一些显示问题的图片,我会写另一个详细的问题,然后发布链接。

JCraft 在 8 月 4 日编辑:我发布了一个新问题:Calibrated camera get matched points for 3D reconstruction, ideal test failed。 @Schorsch 非常感谢您帮助格式化我的问题。我将尝试学习如何在 SO 中进行输入,并尝试提高我的语法。谢谢!

【问题讨论】:

  • 欢迎来到 SO,JCraft!您能否澄清一下,您的结果与预期输出有何不同?也许您可以上传示例数据(例如tinypic.com)并链接到它们?目前,您的问题的答案可能只是 yes - 这可能不是您所追求的。但是,不看原图和处理后的图,有点条带是很难理解的。
  • 你好 Schorsch!感谢您的回复。是的,你是对的,很难想象问题是如何发生的。我将尝试重做该过程并上传一些图片。

标签: matlab computer-vision matlab-cvst 3d-reconstruction


【解决方案1】:

如果您只有基本矩阵和内在函数,则只能进行大规模重建。那就是您的平移向量 t 在某些未知单位中。您可以通过多种方式获得真实单位的 3D 点:

  • 您需要在世界上有一些参考点,它们之间的距离已知。通过这种方式,您可以以未知单位计算它们的坐标,并计算比例因子以将未知单位转换为实际单位。
  • 您需要了解每台摄像机相对于公共坐标系的外在因素。例如,您可以在场景中的某处有一个棋盘校准模式,您可以从中检测和计算外在因素。请参阅此example。顺便说一句,如果您知道外在因素,则可以直接计算基本矩阵和相机投影矩阵,而无需匹配点。
  • 您可以进行立体校准来估计相机之间的 R 和 t,这也可以为您提供基本矩阵和基本矩阵。看到这个example

【讨论】:

  • 您好 Dima,非常感谢您的回答!是的,我知道您对使用棋盘格校准相机的意思。实际上我在matlab中使用了caltech的棋盘和校准工具箱来获取内在参数(在OpenCV中也是如此,类似的结果)。
  • 抱歉,无法编辑最后一条评论。我要测试的是这样一个条件:我们想用我们的相机拍摄一个非常大的东西(例如一个 10m*10m*10m 的管子)并找出一些点的 3D 坐标。在这种情况下,在每张图片中都包含棋盘格并不容易。因此无法直接计算外在参数。这就是为什么我想使用带有匹配点的已知内在矩阵来获得外在矩阵,然后进行重建。
  • 在这种情况下,您可以尝试在现场为每对摄像机设置一个棋盘格。这样 cam1 和 cam2 就会有一个共同的参考坐标系,然后是 cam2 和 cam3,然后是 cam3 和 cam4,... 等等。如果您有带有计算机视觉系统工具箱的 MATLAB R2013b 或更高版本,请尝试使用 Camera Calibrator 应用程序和相关功能。 mathworks.com/help/vision/ug/…
  • 这真是个好主意!我正在尝试使用某种校准工具(可能包含 8 或 10 个点,但不是棋盘那么多)为每对视图获取参考。我正在做这个实验。以及我想首先在 OpenCV 中尝试 cvFindExtrinsicParams2() 的功能
  • 查看 MATLAB 计算机视觉系统工具箱中的 extrinsics 函数。
【解决方案2】:

平面物体是关键表面,无法通过它们实现您的目标。尝试在平面外添加两个(或更多)点(如果仍然感兴趣,请参阅 Hartley 和 Zisserman 或其他关于此事的文字)

【讨论】:

    猜你喜欢
    • 2012-10-21
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    相关资源
    最近更新 更多