将2D点反投影到3D Plucker线

时间:2012-09-10 17:47:27

标签: projection raytracing projection-matrix projective-geometry

我正在尝试构建一个跟踪器(手动跟踪个人项目),因此我需要使用Plucker坐标将2d点反投影到3d线。 (如光线追踪)

作为输入,我有一个点的2d坐标和投影矩阵。

关于plucker坐标的网上信息概述了它们有用的原因,但是没有纸质分析地描述上述过程。 (他们只是提到他们回到投影线,而没有任何进一步的描述)

有人可以指出我正确的方向吗?

3 个答案:

答案 0 :(得分:7)

显然这背后没有任何魔力,我正在寻找一个公式/定理,直接从我的'输入'到plucker坐标,而没有这样的东西。

作为输入,我们有

  • (投影)点的2D坐标
  • 投影矩阵

使用这两个输入,我们可以将这个2d点反投影到光线(3D线)。 该3D线的所有3D点都投影到相同的2D点。 默认情况下,光线通过相机中心(或投影中心等)。

有关必要的公式,请参阅

一般的想法是,为了定义一条线,你需要2点。 我们选择(使用上述来源的方程式)

  • 相机中心(所有投影光线默认通过此点)
  • ray @ infinity的一个点(这很好,因为无限远处的点也是该行的方向向量 - >稍后需要这个用于插入行表示)

(我们可以找到相机中心和另一个任意点,但是我们需要一个额外的步骤来找到线的方向,通过减去这两个点的坐标。)

总结一下,我们找到了

  • 相机中心(p)
  • 线的方向(d)(点@无穷大) (无限远处的点数相当于指示)

这些足以表示一条线,但是当我们必须计算例如我们的算法中3D点到该线的距离时,这种表示不是最佳的。 这就是为什么,找到这种表示后(没有魔法立刻给我们提取线),我们将线表示改为plucker-line-representation

Plucker line只是该行所需的另一种表示:

  • 线的方向(我们已经拥有它!!! - > d - >指向无穷远处)
  • 该行的“时刻”(m),很容易从之前的表示中计算出来:

    m = p ^ d(^ - >交叉产品)

我希望这能为将来需要它的人清除事情,我认为这是一件非常容易的事情,但一开始事情可能并不那么明显。

对于实际情况,为什么要使用此plucker-line-representation,请检查

答案 1 :(得分:2)

使用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.

答案 2 :(得分:1)

我发布这个仅仅是为了完整性,基于OP接受的答案中引用的论文中的一些内容,@AndréAichert的答案以及[1]中p493中的描述。

以下是一个最低限度工作的MATLAB示例,用于构建通过两个点AB并计算其到点C的距离的Plucker线。

A = [0 0 0]';
B = [0 0 5]';
C = [1 1 0]';

L = pluckerline(A,B);

distance = compute_plucker_distance(C, L) % Will output 1.4142

%%-------------------------------------------------------------------------

% Comptes the Plucker line passing through points A and B
function L = pluckerline(A, B)
    l = (B - A) / norm(B - A);
    m = cross(A, l);

    L = [l ; m];
end

%%-------------------------------------------------------------------------

% Comptes the distance between the point P and Plucker line L
function distance = compute_plucker_distance(P, L)
    l = L(1:3);
    m = L(4:end);

    distance = norm(cross(P, l) - m);
end

[1] Sommer,Gerald,ed。 Geometric computing with Clifford algebras: theoretical foundations and applications in computer vision and robotics.施普林格科学&amp;商业媒体,2013年。