三角测量和直接线性变换

时间:2010-02-16 21:21:52

标签: matlab computer-vision linear-algebra

按照Hartley / Zisserman的Multiview Geometery,算法12:最佳三角测量方法(p318),我得到了相应的图像点xhat1和xhat2(步骤10)。在步骤11中,需要计算3D点Xhat。一种这样的方法是直接线性变换(DLT),在12.2(p312)和4.1(p88)中提到。

同质方法(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

更新算法

中xi部分的工作代码
% 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

2 个答案:

答案 0 :(得分:12)

如书中所述(第12.2节), p i T <强> P 即可。因此,您无需转置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);

答案 1 :(得分:0)

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,:));

可以简化为A = normr(A)