Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将由三焦点张量计算的投影矩阵转换为三维点估计_C++_Opencv_Projection_3d Reconstruction - Fatal编程技术网

C++ 将由三焦点张量计算的投影矩阵转换为三维点估计

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

我正在使用以下遗留代码: 用于从3个不同视图中的给定对应二维点估计三维点。我面临的问题与此处所述相同:

我可以使用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]
此外,我使用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链接已断开,我已修复它。你找到我指的那部分了吗?找到了。但是没有能够理解到实现的水平:(这是非常高级的东西。我可以给你一个算法的草图,我使用的很好,但是你可能需要理解背景才能正确地实现它…参见算法的大纲。