Calcule la matriz de transformación a partir de un conjunto de coordenadas (con OpenCV)

Tengo un cubo pequeño con n (puedes suponer que n = 4) puntos distinguidos en su superficie. Estos puntos están numerados (1-n) y forman un espacio de coordenadas, donde el punto #1 es el origen.

Ahora estoy usando una cámara de seguimiento para obtener las coordenadas de esos puntos, en relación con el espacio de coordenadas de la cámara. Eso significa que ahora tengo n vectores p_i apuntando desde el origen de la cámara a la superficie del cubo.

Con esa información, intento calcular la matriz de transformación afín (rotación + traslación) que representa la transformación entre esos dos espacios de coordenadas. La parte de traducción es bastante trivial, pero estoy luchando con el cálculo de la matriz de rotación.

¿Hay alguna funcionalidad integrada en OpenCV que pueda ayudarme a resolver este problema?

preguntado el 22 de mayo de 12 a las 18:05

3 Respuestas

Suena como cvGetPerspectiveTransform es lo que buscas; cvFindHomograpy también puede ser útil.

contestado el 22 de mayo de 12 a las 18:05

Esos parecen funcionar con información 2D, pero mis datos son todos 3D. - Niko

Ah, lo siento, me perdí eso. No creo que OpenCV proporcione nada listo para usar para ese caso. Para calcular rotaciones (si no hay escalado y ya ha realizado las traducciones necesarias), un poco de trigonometría debería ser suficiente... - Josh Bleecher Snyder

resolverPnP debería darte la matriz de rotación y el vector de traslación. Pruébalo con CV_EPNP or CV_ITERATIVE.

Edit: O tal vez estás buscando descomposición RQ.

contestado el 22 de mayo de 12 a las 23:05

Mire el tutorial de cámara estéreo para OpenCV. OpenCV usa un tablero de ajedrez plano para todos los cálculos y establece su dimensión Z en 0 para construir su lista de puntos 3D. Ya tiene puntos 3D, así que cambie el código en el tutorial para reflejar su lista de puntos 3D. Entonces puedes calcular la transformación.

contestado el 23 de mayo de 12 a las 22:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.