Matlab / Octave 構文を使用した今後の参考のために!
Plücker 座標での 2 点の結合は、次のように表すことができます。
% 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)
したがって、逆投影光線のプラッカー座標は次のようになります。
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')