Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.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
Matlab 三角测量及;直接线性变换_Matlab_Computer Vision_Linear Algebra - Fatal编程技术网

Matlab 三角测量及;直接线性变换

Matlab 三角测量及;直接线性变换,matlab,computer-vision,linear-algebra,Matlab,Computer Vision,Linear Algebra,根据Hartley/Zisserman的多视图几何测量,算法12:最优三角剖分法(p318),我得到了相应的图像点xhat1和xhat2(步骤10)。在步骤11中,需要计算三维点Xhat。其中一种方法是直接线性变换(DLT),如12.2(第312页)和4.1(第88页)所述 齐次方法(DLT)p312-313指出,它找到的解是单位奇异向量,对应于a的最小奇异值,因此 A = [xhat1(1) * P1(3,:)' - P1(1,:)' ; xhat1(2) * P1(3,:)' -

根据Hartley/Zisserman的多视图几何测量,算法12:最优三角剖分法(p318),我得到了相应的图像点xhat1和xhat2(步骤10)。在步骤11中,需要计算三维点Xhat。其中一种方法是直接线性变换(DLT),如12.2(第312页)和4.1(第88页)所述

齐次方法(DLT)p312-313指出,它找到的解是单位奇异向量,对应于a的最小奇异值,因此

A = [xhat1(1) * P1(3,:)' - P1(1,:)' ;
      xhat1(2) * P1(3,:)' - P1(2,:)' ;
      xhat2(1) * P2(3,:)' - P2(1,:)' ;
      xhat2(2) * P2(3,:)' - P2(2,:)' ];

[Ua Ea Va] = svd(A);
Xhat = Va(:,end);

plot3(Xhat(1),Xhat(2),Xhat(3), 'r.');
然而,A是16x1矩阵,导致Va为1x1

在获取3D点时,我做错了什么(和修复了什么)

对于其有价值的示例数据:

xhat1 =

  1.0e+009 *

    4.9973
   -0.2024
    0.0027


xhat2 =

  1.0e+011 *

    2.0729
    2.6624
    0.0098


P1 =

  699.6674         0  392.1170         0
         0  701.6136  304.0275         0
         0         0    1.0000         0


P2 =

  1.0e+003 *

   -0.7845    0.0508   -0.1592    1.8619
   -0.1379    0.7338    0.1649    0.6825
   -0.0006    0.0001    0.0008    0.0010


A =    <- my computation

  1.0e+011 *

   -0.0000
         0
    0.0500
         0
         0
   -0.0000
   -0.0020
         0
   -1.3369
    0.2563
    1.5634
    2.0729
   -1.7170
    0.3292
    2.0079
    2.6624

如本书(第12.2节)所述,piTp行。因此,您不需要转置
P1(k,:)
(即正确的公式是
A=[xhat1(1)*P1(3,:)-P1(1,:);…

我希望那只是个打字错误

此外,建议将
A
的每一行用其L2规范化,即对所有
i

A(i,:)=A(i,:)/norm(A(i,:);

如果你想打印三角化的3D点,你必须在打印之前规范化
Xhat
(否则没有意义),即

Xhat=Xhat/Xhat(4);


可以简化为
A=normr(A)

发布xhat1、P1等的最小预期输入可能更好,这样我们就可以复制和粘贴一个工作示例,而不必假设输入的形式。Jacob,你提到A的行应该被规范化。Frobenius norm(?)与p109上的标准化(标准化xhat1和xhat2)大不相同,它执行DLT然后反标准化?不,它不同-它只是用来让SVD计算利用余弦度量。我是指L2标准,即| | A(I:)||.在我的例子中,在应用SVD之前对A行进行规范化会导致不可预测的重投影错误(通过将三角点投影到摄像机上并计算投影与三角测量输入之间的距离来计算)从0.007到22px。移除标准化使范围达到0.001-0.4px。
% xi
A = [xhat1(1) * P1(3,:) - P1(1,:) ;
     xhat1(2) * P1(3,:) - P1(2,:) ;
     xhat2(1) * P2(3,:) - P2(1,:) ;
     xhat2(2) * P2(3,:) - P2(2,:) ];

A(1,:) = A(1,:)/norm(A(1,:));
A(2,:) = A(2,:)/norm(A(2,:));
A(3,:) = A(3,:)/norm(A(3,:));
A(4,:) = A(4,:)/norm(A(4,:));

[Ua Ea Va] = svd(A);
X = Va(:,end);
X = X / X(4);   % 3D Point
A(1,:) = A(1,:)/norm(A(1,:));
A(2,:) = A(2,:)/norm(A(2,:));
A(3,:) = A(3,:)/norm(A(3,:));
A(4,:) = A(4,:)/norm(A(4,:));