2009-07-02 32 views
5

Tengo un problema matemático en 3D que parece que no puedo resolver.Proyección 3D inversa (triángulo)

Tengo datos de 3 puntos. Los datos son una coordenada (2D) en un plano, flotando en algún lugar del espacio tridimensional. También sé la coordenada (2D) de la proyección. Que resulta en la siguiente matriz de datos:

[[[x1,y1], [px1,py1], 
[[x2,y2], [px2,py2], 
[[x3,y3], [px3,py3]] 

Cuando la normal (x1 etc.) coordina reposar durante las coordenadas en el plano y el otro (PX1 etc.) para las coordenadas proyectadas.

Lo que me gustaría hacer es proyectar una nueva coordenada 2D ([x4, y4]).

.

Lo he intentado hasta ahora:

Por supuesto, tiene un ojo para la proyección, por lo que me puse a [xe, ye, -1]. El xe y ye son conocidos. (Es una referencia de fotos, así que simplemente coloqué el ojo en el centro de la fotografía.)

Debajo del ojo coloqué la superficie de proyección (z = 0). Eso le da a la siguiente proyección de coordenadas:

[[[x1,y1], [px1,py1,0], 
[[x2,y2], [px2,py2,0], 
[[x3,y3], [px3,py3,0]] 

no puede hacer lo mismo para las coordenadas en el avión, ya que no sabía nada de ese plano.

También pensé que podría hacer una fórmula parametrizada de las líneas que se ejecutan desde el ojo a través de las coordenadas de proyección. Para line1 que sería:

line1x = xe+(px1-xe)*t1 
line1y = ye+(py1-ye)*t1 
line1z = -1+t1 // = -1+(0--1)*t1 

También sé la distancia entre los puntos en 3D. Eso es lo mismo que en 2D. Eso significa que la distancia entre el punto1 y el punto2 sería sqrt ((x1-x2)^2 + (y1-y2)^2).

También sé la distancia entre las líneas (línea 1 y línea 2) en cualquier momento. Eso es sqrt ((line1x-line2x)^2 + (line1y-line2y)^2 + (line1z-line2z)^2).

Sin embargo, realmente no sé cómo ir desde aquí ... O incluso si esta es la ruta correcta para tomar.

.

Espero que entiendas lo que quiero poder hacer y que me puedes ayudar.

¡Gracias de antemano!

+0

¿Estás diciendo que tienes tres puntos (xn, yn) que se proyectan en un plano en puntos (pxn, pyn) y quieres calcular cómo mapear un nuevo punto (x4, y4) en el ¿avión? –

+0

Sí, goodgai, eso es lo que estoy diciendo. Sin embargo, cuando uso el término "plano" en mi pregunta, me refiero al plano en el que se encuentran los puntos (xn, yn) (que creo que es significativo cuando intento mapear el cuarto punto). Perdón por la confusion. –

+0

Tiene tres puntos en un plano (xn, yn) que se proyectan en el plano de proyección (pxn, pyn). Esta es también una proyección central (perspectiva), por lo que todos los puntos se proyectan a través de rayos desde un solo punto. Desea saber cómo invertir la proyección: es decir, si le dan un punto proyectado (px4, py4) cómo obtener (x4, y4)?Lo que no entiendo es que tus puntos originales no tienen ninguna coordenada Z en absoluto. ¿Por qué son x/y solo? ¿Conocen la coordenada z o son estas coordenadas x/y dentro del propio sistema de coordenadas del avión ...? –

Respuesta

1

Escribir

(x4,y4,1) = A1*(x1,y1,1) + A2*(x2,y2,1) + A3*(x3,y3,1), 

resolver para A1, A2, A3. Luego

(xp4,yp4) = A1*(px1,py1) + A2*(px2,py2) + A3*(px3,py3). 

1st edit.

(A1, A2, A3) es la solución del sistema lineal Mat * (A1, A2, A3) = (x4, y4,1).

 (x1 x2 x3) 
Mat = (y1 y2 y3) 
     ( 1 1 1) 

Esto se puede resolver de varias maneras. Por ejemplo, usando las reglas Cramer's.

2nd edit.

Los 1 que inserté no son coordenadas Z, sino extensiones homogéneas de las coordenadas de entrada (que deben ser coordenadas euclidianas). (A1, A2, A3) son coordenadas homogéneas en la base formada por los vértices del triángulo.

3rd edit.

La correspondencia entre el plano 3D y el plano de proyección es una transformación proyectiva. Se puede definir como una matriz T 3x3 que opera en coordenadas homogéneas en el plano de entrada (x, y, 1) (en su sistema de coordenadas) y produce coordenadas (u, v, t) en el plano de proyección. Entonces px = u/t y py = v/t.

Si un punto tiene coordenadas homogéneas (A1, A2, A3) en la base formada por tres puntos del plano de entrada (no en la misma línea), entonces su proyección tiene las mismas coordenadas homogéneas en la base proyectada.

Me pareció bastante claro hace 1 hora, pero ahora estoy empezando a dudar: tal vez sea necesario conocer un par adicional de puntos para tener una solución única al problema ... Si puede encontrarlo, tenga un vistazo al libro "Geometría proyectiva algebraica" por JG Semple y G.T. Kneebone.

+0

Parece que podría ser cierto ... Pero, ¿cómo determino A1, A2 y A3? Gracias! –

+0

No entiendo cómo se puede resolver este problema sin un ojo ... La ubicación del ojo cambiaría la proyección, ¿no? –

+0

Si se coloca en el sistema de coordenadas del plano inicial, pierde el plano de proyección. No creo que pueda resolverse tan fácilmente. –

0

Realmente no entiendo el problema? ¿Está tratando de ubicar un objeto en el espacio 3D que sabe que está ubicado en un plano (una pared o piso, por ejemplo) y la única entrada que tiene son 3 puntos (de los cuales conoce las distancias entre el espacio en 3D) desde una cámara-imagen?

En ese caso, tendrá 3 ecuaciones como esta, donde LocalCoordinates son las coordenadas de los puntos en el espacio de objetos (da la distancia conocida entre los puntos) y world es la posición de los objetos en el espacio 3d.

cameraCoordinates = world*view*projection*localCoordinates 

Esto dará lugar a un sistema de ecuaciones con 6 desconocido (rotación y la posición en 3d) y 6 ecuaciones (2 para cada punto). Sin embargo, no será lineal, por lo que deberá resolverlo utilizando métodos numéricos. Pruebe el método de Newton Rapson.

2

Hay una función de Proyección, que puede transformar puntos para que Proyección ([x1, y1]) = [px1, py1], Proyección ([x2, y2]) = [px2, py2], Proyección ([x3 , y3]) = [px3, py3]. Si lo entiendo correctamente, el autor quiere saber cómo encontrar esta función de Proyección, para que pueda transformar [x4, y4] en [px4, py4].

Dado que se trata de aviones de aquí, la función de proyección se parece a esto:

Proj([ix, iy]) : 
    return [ax*ix + bx*iy + cx, 
      ay*iy + by*iy + cy]; 

El uso que podemos hacer 2 sistemas de ecuaciones a resolver.

El primero
x1 * hacha + y1 * bx + cx = px1
x2 * hacha + y2 * bx + cx = px2
x3 * ax + y3 * bx + cx = px3

Resolviendo para hacha, bx y cx nos

ax = (px1 * (y3 - y2) - px2*y3 + px3*y2 + (px2 - px3) * y1)/
    (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1) 
bx = - (px1 * (x3 - x2) - px2*x3 + px3*x2 + (px2 - px3) * x1)/
    (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1) 
cx = (px1 * (x3*y2 - x2*y3) + x1 * (px2*y3 - px3*y2) + (px3*x2 - px2*x3) * y1)/
    (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1) 

da la segunda x1 * ay + y1 * por + cy = AP1
x2 * ay + y2 * por + cy = AP2
x3 * ay + y3 * por + cy = AP3

Resolviendo para ay, por y cy nos da

ay = (py1 * (y3 - y2) - py2*y3 + py3*y2 + (py2 - py3) * y1)/
    (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1) 
by = - (py1 * (x3 - x2) - py2*x3 + py3*x2 + (py2 - py3) * x1)/
    (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1) 
cy = (py1 * (x3*y2 - x2*y3) + x1 * (py2*y3 - py3*y2) + (py3*x2 - py2*x3) * y1)/
    (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1) 

Nota : Utilicé this tool para resolver sistemas de ecuaciones.

+0

Wow, gracias por la amplia respuesta, sin embargo, creo que esta solución es un poco sospechosa ya que el método que utiliza no está realmente relacionado con la proyección. No hay, por ejemplo, ningún ojo. Por lo tanto, dudo que funcione correctamente ... Sin embargo, definitivamente voy a intentarlo. Te dejaré saber si funcionó. ¡Gracias! –

+0

Esta solución no le dará ningún ojo ni ninguna información sobre el plano del triángulo original, pero debería resolver su problema. –

+0

+1 para señalar una gran herramienta – PiotrK

0

Un "bit" tarde aquí, pero la respuesta mejor calificada no tiene en cuenta el espacio 3D del problema. Tenemos un problema de proyección en perspectiva, con tres puntos en un plano (en realidad, 3 puntos tridimensionales) que se proyectan (como en geometría proyectiva) en la superficie de una cámara.

No es posible dar una solución inequívoca a este problema (existen múltiples soluciones). El problema general de encontrar una posición de cámara y plantear dados 3 puntos tridimensionales y sus respectivas proyecciones bidimensionales de perspectiva se puede resolver utilizando el algoritmo P3P (Perspectiva-3 puntos) del RANSAC paper original, que ofrece hasta cuatro posibles soluciones posibles (con el puntos delante de la cámara).

Dada una pose de cámara, es trivial calcular la proyección de puntos de avión adicionales.