将从三基张量计算的投影矩阵转换为估计三维点

5
我正在使用这个遗留代码:http://fossies.org/dox/opencv-2.4.8/trifocal_8cpp_source.html 来从给定的来自3个不同视角的对应2D点中估算3D点。我面临的问题与此处说明的问题相同:http://opencv-users.1802565.n2.nabble.com/trifocal-tensor-icvComputeProjectMatrices6Points-icvComputeProjectMatricesNPoints-td2423108.html 我成功使用icvComputeProjectMatrices6Points计算了投影矩阵。我使用了来自3个视角的6组对应点。结果如下所示:
projMatr1 P1 = 
[-0.22742541, 0.054754492, 0.30500898, -0.60233182;
  -0.14346679, 0.034095913, 0.33134204, -0.59825808;
  -4.4949986e-05, 9.9166318e-06, 7.106331e-05, -0.00014547621]

projMatr2 P2 = 
[-0.17060626, -0.0076031247, 0.42357284, -0.7917347;
  -0.028817834, -0.0015948272, 0.2217239, -0.33850163;
  -3.3046148e-05, -1.3680664e-06, 0.0001002633, -0.00019192585]

projMatr3 P3 = 
[-0.033748217, 0.099119112, -0.4576003, 0.75215244;
  -0.001807699, 0.0035084449, -0.24180284, 0.39423448;
  -1.1765103e-05, 2.9554356e-05, -0.00013438619, 0.00025332544]

此外,我使用 icvReconstructPointsFor3View 计算出三维点。这六个三维点如下:
4D points = 
[-0.4999997, -0.26867214, -1, 2.88633e-07, 1.7766099e-07, -1.1447386e-07;
  -0.49999994, -0.28693244, 3.2249036e-06, 1, 7.5971762e-08, 2.1956141e-07;
  -0.50000024, -0.72402155, 1.6873783e-07, -6.8603946e-08, -1, 5.8393886e-07;
  -0.50000012, -0.56681377, 1.202426e-07, -4.1603233e-08, -2.3659911e-07, 1]

然而,实际的三维点如下:

   - { ID:1,X:500.000000, Y:800.000000, Z:3000.000000}
   - { ID:2,X:500.000000, Y:800.000000, Z:4000.000000}
   - { ID:3,X:1500.000000, Y:800.000000, Z:4000.000000}
   - { ID:4,X:1500.000000, Y:800.000000, Z:3000.000000}
   - { ID:5,X:500.000000, Y:1800.000000, Z:3000.000000}
   - { ID:6,X:500.000000, Y:1800.000000, Z:4000.000000}

我的问题是如何将P1、P2和P3转换为一种允许有意义的三角剖分的形式?我需要使用三基张量计算正确的3D点。

1个回答

10

三焦张量无法帮助您,因为与基本矩阵一样,它只能实现场景和相机姿态的投影重建。如果X0_jP0_i是真实的三维点和相机矩阵,这意味着重建的点Xp_j = inv(H).X0_j和相机矩阵Pp_i = P0_i.H仅在一个未知的公共4x4矩阵H上定义。

为了获得度量重建,您需要知道相机的校准矩阵。无论您是否知道这些矩阵(例如,如果您使用虚拟摄像机进行图像渲染),或者您使用相机校准进行估计(请参见OpenCV校准教程),您都可以在“三基张量的几何、约束和计算”第7.4.5节中找到一种获得度量重建的方法,作者是C.Ressl(PDF)
请注意,即使使用此方法,除非您具有一些附加知识(例如两个固定的3D点之间的实际距离的知识),否则无法获得按比例缩放的3D重建。
算法草图如下:
输入:三个相机矩阵P1,P2,P3(投影世界坐标,选择坐标系使得P1 = [I | 0]),相关的校准矩阵K1,K2,K3和一个点对应x1,x2,x3
输出:三个相机矩阵P1_E,P2_E,P3_E(度量重建)。
  1. 设置 P1_E=K1.[I|0]

  2. 计算基础矩阵 F21F31。记 P2=[A|a]P3=[B|b],则有 F21=[a]x.AF31=[b]x.B(参见[HZ00]中的表9.1),其中对于3x1向量e,[e]x=[0,-e_3,e_2;e_3,0,-e_1;-e_2,e_1,0]

  3. 计算本质矩阵 E21 = K2'.F21.K1E31 = K3'.F31.K1

  4. 对于i=2,3,执行以下操作:

    i. 计算SVD Ei1=U.S.V'。如果 det(U)<0,则设 U=-U。如果 det(V)<0,则设 V=-V

    ii. 定义 W=[0,-1,0;1,0,0;0,0,1]Ri=U.W.V'ti = U的第三列

    iii. 定义 M=[Ri'.ti]xX1=M.inv(K1).x1Xi=M.Ri'.inv(Ki).xi

    iv. 如果 X1_3.Xi_3<0,则设 Ri=U.W'.V',并重新计算 MX1

    v. 如果 X1_3<0,则设 ti = -ti

    vi. 定义 Pi_E=Ki.[Ri|ti]

  5. 执行以下操作以获取t3的正确比例尺(保持一致的前提是||t2||=1):

    i. 定义 p2=R2'.inv(K2).x2p3=R3'.inv(K3).x3

    ii. 定义 M=[p2]x

    iii. 计算比例尺 s=(p3'.M.R2'.t2)/(p3'.M.R3'.t3)

    iv. 设 t3=t3*s

  6. 算法结束:相机矩阵 P1_E,P2_E,P3_E 对场景进行了各向同性缩放和3D坐标系的更改(因此它是一种度量重构)。

[HZ00] "计算机视觉中的多视角几何",作者R.Hartley和A.Zisserman,2000年。

当我已经知道相机校准矩阵K时,如何计算H? - magarwal
PDF链接已经失效,我已经修复了。你找到我所指的那个部分了吗? - BConic
我做了,但是没有理解到实现的水平 :( - magarwal
我理解了大纲,但我正在尝试使用三焦张量的不同方法。由于基础矩阵给出了两个视图之间的关系,类似地,三焦张量给出了三个视图之间的关系... 我已经使用F矩阵-> E矩阵->投影矩阵->三角测量->束调整->度量重建的算法实现了它,效果很好。现在我想尝试使用三焦张量的不同方法。请查看第2860行中的main()函数:https://github.com/marutiagarwal/trifocal/blob/master/trifocal.cpp - magarwal
我已经知道这里3张图像中对应的点,并且我已经硬编码它们。只使用这些点,我计算出3x3x3张量矩阵。我也知道相机校准矩阵(见trifocal.cpp中的第2119行)...但我不知道如何使用它来获取仿射重建。之后,我可以获得“比例”值以获得度量重建。 - magarwal
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接