Pose de cámara informática con matriz de homografía basada en 4 puntos coplanares

Tengo 4 puntos coplanarios en un video (o imagen) que representan un quad (no necesariamente un cuadrado o un rectángulo) y me gustaría poder mostrar un cubo virtual encima de ellos donde las esquinas del cubo se colocan exactamente en el esquinas del video quad.

Dado que los puntos son coplanares, puedo calcular la homografía entre las esquinas de un cuadrado unitario (es decir, [0,0] [0,1] [1,0] [1,1]) y las coordenadas de video del quad.

De esta homografía debería poder calcular una pose correcta de la cámara, es decir, [R | t] donde R es una matriz de rotación de 3x3 yt es un vector de traducción de 3x1 para que el cubo virtual se encuentre en el quad de video.

He leído muchas soluciones (algunas de ellas en SO) e intenté implementarlas, pero parecen funcionar solo en algunos casos "simples" (como cuando el quad de video es un cuadrado) pero no funcionan en la mayoría de los casos.

Aquí están los métodos que probé (la mayoría de ellos se basan en los mismos principios, solo el cálculo de la traducción es ligeramente diferente). Sea K la matriz intrínseca de la cámara y H la homografía. Calculamos:

A = K-1 * H

Deje que a1, a2, a3 sean los vectores de columna de A y r1, r2, r3 los vectores de columna de la matriz de rotación R.

r1 = a1 / ||a1||
r2 = a2 / ||a2||
r3 = r1 x r2
t = a3 / sqrt(||a1||*||a2||)

El problema es que esto no funciona en la mayoría de los casos. Para verificar mis resultados, comparé R y t con los obtenidos por el método solvePnP de OpenCV (usando los siguientes puntos 3D [0,0,0] [0,1,0] [1,0,0] [1,1 , 0]).

Desde que muestro el cubo de la misma manera, noté que en todos los casos solvePnP proporciona resultados correctos, mientras que la pose obtenida de la homografía es mayormente incorrecta.

n teoría, dado que mis puntos son coplanares, es posible calcular la pose desde una homografía, pero no pude encontrar la forma correcta de calcular la pose desde H.

¿Alguna idea de lo que estoy haciendo mal?

Edit después de probar el método de @ Jav_Rock

Hola Jav_Rock, muchas gracias por tu respuesta, probé tu enfoque (y muchos otros también) que parece estar más o menos bien. Sin embargo, todavía tengo algunos problemas al calcular la pose en base a 4 puntos coplanares. Para verificar los resultados, lo comparo con los resultados de solvePnP (que será mucho mejor debido al enfoque de minimización de errores de reproyección iterativa).

Aquí hay un ejemplo

Cubo amarillo: Resuelve PNPBlack Cube: la técnica de Jav_Rock Cubo (s) Cian (y Púrpura): algunas otras técnicas tienen exactamente los mismos resultados

omo puede ver, el cubo negro está más o menos bien, pero no parece estar bien proporcionado, aunque los vectores parecen ortonormale

EDIT2: Normalicé v3 después de calcularlo (para hacer cumplir la ortonormalidad) y parece que también resuelve algunos problemas.

Respuestas a la pregunta(12)

Su respuesta a la pregunta