6

私はトラッカー (ハンド トラッキングの個人的なプロジェクト) を構築しようとしています。このため、プラッカー座標を使用して、2 次元の点を 3 次元の線に逆投影する必要があります。(レイ トレーシングのような)

入力として、点の 2 次元座標と射影行列があります。

プラッカー座標に関する Web 上の情報は、それらが役立つ理由の概要を示していますが、上記の手順を分析的に説明している論文はありません。(彼らは、それ以上の説明なしに、プラッカーラインに逆投影すると言及しているだけです)

誰かが正しい方向に私を特定できますか?

4

3 に答える 3

6

どうやらこの背後に魔法はありません。プラッカー座標への「入力」からすぐに得られる式/定理を探していましたが、そのようなものはありません。

入力として、

  • (投影された) 点の 2D 座標
  • 射影行列

これら 2 つの入力を使用して、この 2 次元の点を光線 (3 次元の線) に逆投影できます。この 3D ラインのすべての 3D ポイントは、同じ 2D ポイントに投影されます。デフォルトでは、光線はカメラの中心 (または投影の中心など) を通過します。

必要な方程式については、次を参照してください。

一般的な考え方は、線を定義するには 2 つの点が必要だということです。見つけることを選択します(上記のソースからの方程式を使用)

  • カメラの中心 (デフォルトでは、すべての投影光線がこの点を通過します)
  • A point of the ray @ infinity (無限にあるポイントは線の方向ベクトルでもあるため、これは便利です -> これは、後でプラッカーの線表現に必要になります)

(カメラの中心と別の任意の点を見つけることもできますが、これらの 2 点の座標を差し引いて、線の方向を見つけるための追加の手順が必要になります。)

要約すると、我々は見つけた

  • カメラ中心 (p)
  • 線の方向 (d) (point @ infinity) (無限の点は方向に相当します)

これらは線を表すのに十分ですが、アルゴリズムでこの線までの 3D ポイントの距離などを計算する必要がある場合、この表現は最適ではありません。これが、この表現を見つけた後(すぐにプラッカー ラインを提供する魔法はありません)、ライン表現をプラッカー ライン表現に変更する理由です。

プラッカーラインは、必要なラインの単なる別の表現です:

  • 線の方向 (既にあります!!! -> d -> 無限遠)
  • 前の表現から簡単に計算できる、線の「瞬間」(m):

    m=p^d (^ -> 外積)

将来これを必要とする人にとって、これが明確になることを願っています。これは非常に簡単なことだと思いますが、最初はそれほど明白ではないかもしれません.

実際のシナリオについては、なぜこのプラッカーライン表現を使用するのかを確認してください

于 2012-09-15T12:58:20.990 に答える
2

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')
于 2014-10-29T07:53:31.220 に答える