我正在尝试构建一个跟踪器(手动跟踪个人项目),因此我需要使用Plucker坐标将2d点反投影到3d线。 (如光线追踪)
作为输入,我有一个点的2d坐标和投影矩阵。
关于plucker坐标的网上信息概述了它们有用的原因,但是没有纸质分析地描述上述过程。 (他们只是提到他们回到投影线,而没有任何进一步的描述)
有人可以指出我正确的方向吗?
答案 0 :(得分:7)
显然这背后没有任何魔力,我正在寻找一个公式/定理,直接从我的'输入'到plucker坐标,而没有这样的东西。
作为输入,我们有
使用这两个输入,我们可以将这个2d点反投影到光线(3D线)。 该3D线的所有3D点都投影到相同的2D点。 默认情况下,光线通过相机中心(或投影中心等)。
有关必要的公式,请参阅
一般的想法是,为了定义一条线,你需要2点。 我们选择(使用上述来源的方程式)
(我们可以找到相机中心和另一个任意点,但是我们需要一个额外的步骤来找到线的方向,通过减去这两个点的坐标。)
总结一下,我们找到了
这些足以表示一条线,但是当我们必须计算例如我们的算法中3D点到该线的距离时,这种表示不是最佳的。 这就是为什么,在找到这种表示后(没有魔法立刻给我们提取线),我们将线表示改为plucker-line-representation
Plucker line只是该行所需的另一种表示:
该行的“时刻”(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示例,用于构建通过两个点A
和B
并计算其到点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年。