5

Estoy tratando de construir un rastreador (proyecto personal de seguimiento de mano), y por esta razón necesito retro-proyectar un 2d punto a una línea 3d, usando coordenadas Plucker. (como trazado de rayos)back-projecting una línea Plucker 2D punto a 3D

Como entrada, tengo las coordenadas 2d de un punto y la matriz de proyección.

La información en la web sobre las coordenadas del desplumador proporciona una visión general de por qué son útiles, pero no hay ningún documento que describa analíticamente el procedimiento mencionado anteriormente. (solo mencionan que proyectan hacia atrás a una línea de plucker, sin más descripción)

¿Alguien puede indicarme la dirección correcta?

Respuesta

7

Aparentemente no hay magia detrás de esto, estaba buscando una fórmula/teorema que resultara inmediatamente de mis 'entradas' a las coordenadas del plucker, mientras que no existe tal cosa.

como entradas, que tienen

  • coordenadas 2D de un (proyectado) el punto
  • la matriz de proyección

El uso de estas dos entradas, podemos back-proyecto este punto 2d a una ray (línea 3D). Todos los puntos 3D de esta línea 3D se proyectan en el mismo punto 2D. El rayo por defecto pasa a través del centro de la cámara (o centro de proyección, etc.).

Para las ecuaciones necesarias, consulte

La idea general es que, con el fin de define una línea, necesitas 2 puntos. Hemos escogido para encontrar (con las ecuaciones de las fuentes mencionadas anteriormente)

  • El centro de la cámara (todos los rayos de proyección pasan por defecto a través de este punto)
  • Un punto del rayo @ infinito (esto es bueno, porque un punto en el infinito es también el vector director de la recta -> esto es necesario más adelante-on para la representación de línea plucker)

(que podríamos haber encontrado el centro de la cámara y otro punto arbitrario, pero entonces necesitaría un paso extra para encontrar la dirección de la línea, restando las coordenadas de estos dos puntos.)

En resumen, hemos encontrado

  • El centro de la cámara (p)
  • La dirección (D) de la línea (punto @ infinito) (puntos en el infinito, son equivalentes a las direcciones)

Estos son suficientes para representar una línea, pero esta representación no es óptima cuando tenemos que calcular, por ejemplo, distancias de puntos 3D a esta línea en nuestro algoritmo. Esta es la razón, después encontrar esta representación (sin magia para darnos líneas plucker inmediatamente), cambiamos nuestra línea de representación de plucker línea representación

línea Desplumadora es más que otra representación de la línea que necesita:

  • la dirección de la línea (ya lo tenemos !!! -> D -> punto en el infinito)
  • el 'momento' (m) de la línea, que es fácil de calcular a partir de la Representación anterior:

    m = p^d (^ -> producto cruz)

Espero que esto aclare las cosas para cualquier persona que se necesitará en el futuro, creo que es una cosa muy fácil, pero al principio las cosas no podrían ser tan aparente

Para un escenario práctico, por qué se podría utilizar este plucker línea de representación, por favor verifica

+0

El enlace al papel está muerto. Para cualquier otra persona interesada, el documento vinculado se titula "Seguimiento 3D combinado de regiones y movimientos basado en movimiento de objetos rígidos y articulados" de Brox et al. Enlace de trabajo (a partir de marzo de 2017): https://www.tnt.uni-hannover.de/papers/data/761/761_1.pdf – M2X

2

Para referencia futura utilizando la sintaxis de Matlab/Octave!

la unión de dos puntos en las coordenadas plucker se puede expresar como sigue

% 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 

Estos son los 6 valores distintos de la matriz anti-simétrica

Lx=B*A'-A*B' 

Un punto en el rayo de retroproyección puede se encuentran

X=pinv(P)*x 

donde

x=[u v 1]' 

es el punto de la imagen en la posición de píxel (u, v) y

pinv(P) 

la pseudoinverse de la matriz de proyección.

El centro de la cámara se puede encontrar como el espacio nulo de la matriz de proyección

C=null(P); 
C=C/C(4) 

El Plücker coordenadas de los rayos de retroproyección son por lo tanto

L=join(X,C) 

Para aquellos interesados ​​en la geometría proyectiva orientada: Si usted normaliza la matriz de proyección de la siguiente manera

% 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; 

Entonces el determinante de la matriz 3x3 izquierda positiva (es decir sistemas diestros) y L apuntará de C a X.

+0

¡Usted, señor, es el MEJOR! – M2X

1

Estoy publicando esto solo para completar, sobre la base de una combinación de algunas cosas en el documento citado en la respuesta aceptada del OP, la respuesta de @ André Aichert y las descripciones en p493 de [1].

El siguiente es un ejemplo MATLAB mínimamente de trabajo para la construcción de la línea de Plucker pasa por dos puntos A y B y calcular su distancia al punto C.

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. Springer Science & Business Media, 2013.

Cuestiones relacionadas