C++ 将由三焦点张量计算的投影矩阵转换为三维点估计
我正在使用以下遗留代码: 用于从3个不同视图中的给定对应二维点估计三维点。我面临的问题与此处所述相同: 我可以使用icvComputeProjectMatrices6Points成功地计算投影矩阵。我使用了3个视图中的6组对应点。结果如下:C++ 将由三焦点张量计算的投影矩阵转换为三维点估计,c++,opencv,projection,3d-reconstruction,C++,Opencv,Projection,3d Reconstruction,我正在使用以下遗留代码: 用于从3个不同视图中的给定对应二维点估计三维点。我面临的问题与此处所述相同: 我可以使用icvComputeProjectMatrices6Points成功地计算投影矩阵。我使用了3个视图中的6组对应点。结果如下: projMatr1 P1 = [-0.22742541, 0.054754492, 0.30500898, -0.60233182; -0.14346679, 0.034095913, 0.33134204, -0.59825808; -4.494
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]
此外,我使用ICVReconconstructPointsFor3View计算了3D点。六个3D点如下所示:
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}
而实际三维点如下所示:
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点。三焦点张量对您没有帮助,因为与基本矩阵一样,它只支持场景和相机姿势的投影重建。如果
X0_j
和P0_i
是真正的3D点和相机矩阵,这意味着重建点Xp_j=inv(H).X0_j
和相机矩阵Pp_i=P0_i.H
仅定义为一个公共4x4矩阵H
,这是未知的
为了获得度量重建,您需要知道相机的校准矩阵。无论您知道这些矩阵(例如,如果您使用虚拟摄像机进行图像渲染)还是使用摄像机校准对其进行估计(请参阅),您都可以在C.Ressl的《三焦点张量的几何、约束和计算》第7.4.5节中找到一种方法来获得度量重建
请注意,即使使用此方法,也无法获得最大比例的三维重建,除非您有一些额外的知识(例如两个固定三维点之间的实际距离的知识)
算法草图:
输入:三个摄像机矩阵P1、P2、P3
(投影世界坐标,选择的坐标系为P1=[I | 0]
),相关校准矩阵K1、K2、K3
和一点对应x1、x2、x3
输出:三个摄像机矩阵P1_E、P2_E、P3_E
(度量重建)
P1_E=K1.[I|0]
F21
,F31
。表示P2=[A | A]
和P3=[B | B]
,你有F21=[A]x.A
和F31=[B]x.B
(见[HZ00]中的表9.1),其中对于3x1向量e[e]x=[0,-e_3,e_2;e_3,0,-e_1;-e_1,0]
E21=K2'.F21.K1
和E31=K3'.F31.K1
i=2,3
,请执行以下操作
一,。计算SVD
Ei1=U.S.V'
。如果det(U)当我已经知道摄像机校准矩阵K时,如何计算H?PDF链接已断开,我已修复它。你找到我指的那部分了吗?找到了。但是没有能够理解到实现的水平:(这是非常高级的东西。我可以给你一个算法的草图,我使用的很好,但是你可能需要理解背景才能正确地实现它…参见算法的大纲。