供将来使用 Matlab / Octave 语法参考!
Plücker坐标中两点的连接可以表示如下
% line = point join point
function L=join(A, B)
L=[
A(1)*B(2)-A(2)*B(1);
A(1)*B(3)-A(3)*B(1);
A(1)*B(4)-A(4)*B(1);
A(2)*B(3)-A(3)*B(2);
A(2)*B(4)-A(4)*B(2);
A(3)*B(4)-A(4)*B(3)
];
end % function
这些是反对称矩阵的 6 个不同值
Lx=B*A'-A*B'
可以找到反投影射线上的一个点
X=pinv(P)*x
在哪里
x=[u v 1]'
是像素位置 (u,v) 处的图像点,并且
pinv(P)
投影矩阵的伪逆。
可以找到相机中心作为投影矩阵的零空间
C=null(P);
C=C/C(4)
因此,背投影光线的 Plücker 坐标为
L=join(X,C)
对于那些对定向投影几何感兴趣的人:如果您将投影矩阵归一化如下
% Get length of principal ray
m3n=norm(P(3,1:3));
% Enforce positivity of determinant
if (det(P(:,1:3))<0)
m3n=-m3n;
end % if
% Normalize
P=P/m3n;
那么左边 3x3 矩阵的行列式是正的(即右手系统),L 会从 C 指向 X。
更新:前几天,一位同事问我要一个矩阵形式的解决方案。如果将以下矩阵与图像点 [x0 x1 x2]' 相乘,则可以直接得到 Plücker 坐标:
A=[
- p12*p23 + p13*p22, + p02*p23 - p03*p22, + p03*p12 - p02*p13
+ p11*p23 - p13*p21, - p01*p23 + p03*p21, + p01*p13 - p03*p11
- p11*p22 + p12*p21, + p01*p22 - p02*p21, + p02*p11 - p01*p12
- p10*p23 + p13*p20, + p00*p23 - p03*p20, + p03*p10 - p00*p13
+ p10*p22 - p12*p20, - p00*p22 + p02*p20, + p00*p12 - p02*p10
- p10*p21 + p11*p20, + p00*p21 - p01*p20, + p01*p10 - p00*p11
]
因此线的方向是
d =
p01*p12*x2 - p02*p11*x2 - p01*p22*x1 + p02*p21*x1 + p11*p22*x0 - p12*p21*x0
p02*p10*x2 - p00*p12*x2 + p00*p22*x1 - p02*p20*x1 - p10*p22*x0 + p12*p20*x0
p00*p11*x2 - p01*p10*x2 - p00*p21*x1 + p01*p20*x1 + p10*p21*x0 - p11*p20*x0
而线矩是:
m =
p03*p10*x2 - p00*p13*x2 + p00*p23*x1 - p03*p20*x1 - p10*p23*x0 + p13*p20*x0
p03*p11*x2 - p01*p13*x2 + p01*p23*x1 - p03*p21*x1 - p11*p23*x0 + p13*p21*x0
p03*p12*x2 - p02*p13*x2 + p02*p23*x1 - p03*p22*x1 - p12*p23*x0 + p13*p22*x0
显然,可以从表达式中提取 [x2 x1 x0] 来得到矩阵形式。以下 MATLAB 符号代码用于生成此解决方案:
syms p00 p01 p02 p03 p10 p11 p12 p13 p20 p21 p22 p23 real
P=[ p00 p01 p02 p03
p10 p11 p12 p13
p20 p21 p22 p23
]
% Some Image Point
syms x0 x1 x2 real
x=[x0 x1 x2]'
% Source Position
C=null(P)
% Backprojection of x
Xtilde=pinv(P)*x
% Backprojection line (Plücker Matrix)
Lx=simplify(C*Xtilde' - Xtilde*C')
% It's homogeneous...
arbitrary_scale=(p00*p11*p22 - p00*p12*p21 - p01*p10*p22 + p01*p12*p20 + p02*p10*p21 - p02*p11*p20)
Lx=Lx*arbitrary_scale
% Plücker Coordinates:
L=[Lx(1,2) Lx(1,3) Lx(1,4) Lx(2,3) Lx(2,4) Lx(3,4)];
% Direction
d=[-L(3) -L(5) -L(6)]';
% Moment
m=[L(4) -L(2) L(1)]';
% In matrix form
A=[
- p12*p23 + p13*p22, + p02*p23 - p03*p22, + p03*p12 - p02*p13
+ p11*p23 - p13*p21, - p01*p23 + p03*p21, + p01*p13 - p03*p11
- p11*p22 + p12*p21, + p01*p22 - p02*p21, + p02*p11 - p01*p12
- p10*p23 + p13*p20, + p00*p23 - p03*p20, + p03*p10 - p00*p13
+ p10*p22 - p12*p20, - p00*p22 + p02*p20, + p00*p12 - p02*p10
- p10*p21 + p11*p20, + p00*p21 - p01*p20, + p01*p10 - p00*p11
]
% Verification: (should be zero)
simplify(A*x - L')