2008-09-25 19 views
16

Tengo 3 puntos en un espacio 3D del cual conozco las ubicaciones exactas. Supongamos que son: (x0,y0,z0), (x1,y1,z1) y (x2,y2,z2).Matriz de proyección 3d a 2d

También tengo una cámara que está mirando estos 3 puntos y conozco las ubicaciones 2D de esos tres puntos en el plano de visualización de la cámara. Por ejemplo, (x0,y0,z0) será (x0',y0'), y (x1,y1,z1) será (x1',y1') y (x2,y2,z2) será (x2',y2') desde el punto de vista de la cámara.

¿Cuál es la forma más fácil de encontrar la matriz de proyección que proyectará esos puntos 3D en puntos 2D en el plano de vista de la cámara. No sabemos nada sobre la ubicación de la cámara.

+0

¡Esta no es mi tarea! –

Respuesta

12

Esto le da dos conjuntos, cada uno de tres ecuaciones con 3 variables:

a*x0+b*y0+c*z0 = x0' 
a*x1+b*y1+c*z1 = x1' 
a*x2+b*y2+c*z2 = x2' 

d*x0+e*y0+f*z0 = y0' 
d*x1+e*y1+f*z1 = y1' 
d*x2+e*y2+f*z2 = y2' 

sólo tiene que utilizar cualquier método de resolución de ecuaciones simultáneas es más fácil en su situación (ni siquiera es difícil de resolver estos "por mano"). Entonces su matriz de transformación es justa ((a, b, c) (d, e, f)).

...

En realidad, es sobre-simplificado y asume una cámara apuntando al origen de su sistema de 3D y ninguna perspectiva de coordenadas.

Para ponerlo en perspectiva, la matriz de transformación funciona más como:

   (a, b, c, d) (xt) 
(x, y, z, 1) (e, f, g, h) = (yt) 
       (i, j, k, l) (zt) 

(xv, yv) = (xc+s*xt/zt, yc+s*yt/zt) if md < zt; 

pero la matriz de 4x3 es más limitado de 12 grados de libertad, ya que debemos tener

a*a+b*b+c*c = e*e+f*f+g*g = i*i+j*j+k*k = 1 
a*a+e*e+i*i = b*b+f*f+j*j = c*c+g*g+k*k = 1 

Así que probablemente debería tener 4 apunta a obtener 8 ecuaciones para cubrir las 6 variables para la posición y el ángulo de la cámara y 1 más para escalar los puntos de vista bidimensionales, ya que podremos eliminar las coordenadas "centrales" (xc, yc).

Así que si tiene 4 puntos y transforma sus puntos de vista 2D para que sean relativos al centro de su pantalla, entonces puede obtener 14 ecuaciones simultáneas en 13 variables y resolverlas.

Desafortunadamente, seis de las ecuaciones no son ecuaciones lineales. Afortunadamente, todas las variables en esas ecuaciones están restringidas a los valores entre -1 y 1 por lo que aún es posible resolver las ecuaciones.

+0

Tu solución fue probablemente la mejor respuesta que encontré para mi problema. Por favor describa un poco más sobre la segunda parte de la solución. lo que es xv y yv también md y zt y xt yt zt. Muchas gracias –

0

No creo que haya suficiente información para encontrar una solución definitiva. Sin conocer la ubicación de su cámara y sin conocer su plano de visión, hay un número infinito de matrices que pueden resolver este problema.

+0

No, él quiere decir que hay un número infinito de matrices que hacen lo que usted pide para un conjunto dado de puntos. Necesita más puntos o menos libertad (por ejemplo, arregle el campo de visión de la cámara) para arreglar esto. –

+0

¿cuántos puntos necesito? –

+1

Si conoce el plano de vista de la cámara (la distancia Z de la cámara), usando los puntos, podría determinar la posición de la cámara ya que es solo la intersección de las 3 líneas. A partir de ahí, creo que los ejes de la matriz podrían ser posibles de calcular. –

3

Su cámara tiene (al menos) 7 grados de libertad - 3 para posición, 3 para orientación y 1 para FOV. Estoy seguro de que alguien me va a corregir si me equivoco, pero no parece que 3 puntos sean suficientes para una solución completa.

Para una solución generalizada a este problema, busque 'Ver correlación' en Graphics Gems II.

+0

7 generalmente es correcto, aunque algunos sistemas permiten dos parámetros para FOV: vertical y horizontal. Por lo general, son proporcionales entre sí (es decir, una pantalla de 4: 3 = relación FOV de 4: 3), pero en algunos casos esto puede ser sesgado si el usuario lo desea. –

2

Lo que está buscando se llama algoritmo de Estimación de la postura. Eche un vistazo a la implementación POSIT en OpenCV: http://opencv.willowgarage.com/documentation/c/calib3d_camera_calibration_and_3d_reconstruction.html#posit

Necesitará cuatro o más puntos, y es posible que no se encuentren en el mismo plano.

Un tutorial para esta implementación está aquí: http://opencv.willowgarage.com/wiki/Posit

no cuidar sin embargo: en el tutorial se utiliza una ventana cuadrada, por lo que todas las coordenadas son vistas en el -1, -1 a 1,1 gama . Esto lleva a suponer que estos deben estar en el sistema de coordenadas de la cámara (antes de la corrección de la relación de aspecto). Este no es el caso, por lo tanto, si usa una ventana gráfica con, por ejemplo, una relación de aspecto de 4: 3, entonces sus coordenadas de entrada deberían estar en el rango -1.3333, -1 a 1.3333,1.

Por cierto, si sus puntos de mosto se encuentran en el mismo plano, entonces también se puede mirar el algoritmo CameraCalibration de OpenCV, pero esto es más complicado de configurar y requiere más puntos como entrada. Sin embargo, también le proporcionará la información de distorsión y los parámetros intrínsecos de su cámara.

Cuestiones relacionadas