He leído Encontrar una matriz de transformación 3D basada en las coordenadas 2D pero creo que mi situación es diferente porque creo que necesito una matriz 4x3, no una matriz 3x3. No estoy seguro, pero esto podría ser porque tengo la rotación y la traducción, además de sólo la transformación de la perspectiva.
Esta es la configuración:
Supongamos que tenemos varios puntos 2D en una imagen (x1,y1) (x2,y2) (x3,y3) (x4,y4)
suponga que también tiene varios puntos 3D correspondientes en un arbitrario plano: (X1,Y1,Z1) (X2,Y2,Z2) (X3,Y3,Z3) (X4,Y4,Z4)
para transformar de 2D a 3D utilizando coordenadas homogéneas podemos utilizar
(X,Y,Z,W) = M*(x,y,1). Aquí M debe ser una matriz de 4x3
Así, un punto 2D-homogenousCoords se transforma en un punto 3D-homogenousCoords.
Entonces, podría dividir (X,Y,Z,W) por W para obtener (X,Y,Z,1), que es una forma en la que puedo leer los verdaderos valores X,Y,Z en coordenadas "regulares".
Ahora, aquí hay un problema. No sé cuál es W para cualquiera de mis puntos (X,Y,Z). (Si supiera el W de cada punto, creo que hay una manera estándar de álgebra lineal para encontrar M.)
Así que para encontrar M, multiplico las cosas de la siguiente manera:
X = M11*x + M12*y + M13*1
Y = M21*x + M22*y + M23*1
Z = M31*x + M32*y + M33*1
W = M41*x + M42*y + M43*1
pero estas X,Y,Z,W son las coordenadas homogéneas, así que para obtener las coordenadas X,Y,Z "reales":
X = (M11*x + M12*y + M13*1) / (M41*x + M42*y + M43*1)
Y = (M21*x + M22*y + M23*1) / (M41*x + M42*y + M43*1)
Z = (M31*x + M32*y + M33*1) / (M41*x + M42*y + M43*1)
Además, puedo eliminar un parámetro de cada ecuación multiplicando cada ecuación por (1/M43)/(1/M43). Entonces también puedo cambiar el nombre de la relación de los parámetros. Me queda:
X = (a1*x + a2*y + a3*1) / (a10*x + a11*y + 1)
Y = (a4*x + a5*y + a6*1) / (a10*x + a11*y + 1)
Z = (a7*x + a8*y + a9*1) / (a10*x + a11*y + 1)
Finalmente introduzco todos los valores (X,Y,Z) y (x,y,z) que tengo en múltiples instancias de estas ecuaciones y reordeno algebraicamente todo para obtener la forma clásica A=Bx, donde x es el vector de a's desconocidas (a1 ... a11).
Una vez que tenga de a1 a a11, podría volver atrás y averiguar cuáles eran los componentes originales de M. En cualquier caso, ahora puedo proyectar puntos de 2D a 3D utilizando la transformación de perspectiva, incluso si hay rotación o traslación.
Mi pregunta es si esta es la mejor manera de encontrar este tipo de transformación general de perspectiva 2D a 3D.
0 votos
Vea aquí: mathematica.stackexchange.com/questions/9244/
0 votos
Y aquí: stackoverflow.com/questions/8925569/
0 votos
@user7530 Esos enlaces son muy útiles. Parece que encontrar la proyección de la perspectiva se reduce a resolver un sistema de ecuaciones lineales. Todavía me pregunto cuáles son exactamente los pasos para pasar de la ecuación matricial original al sistema de ecuaciones.
0 votos
El truco consiste en trasladar la división al otro lado, lo que convierte el sistema no lineal en un sistema lineal en las variables desconocidas (los coeficientes de la matriz). Consulta la pregunta de mathematica para ver la solución trabajada.
0 votos
Es cierto y lo entiendo. Sin embargo, ¿cómo se obtiene exactamente el sistema no lineal de ecuaciones en primer lugar? En coordenadas homogéneas, la ecuación matricial comienza siendo lineal: (pt 3D en coordenadas homogéneas) = Matriz* (pt 2D en coordenadas homogéneas). He intentado derivarlo en mi post, pero no estoy seguro de que sea correcto
0 votos
Esto podría ayudar: math.stackexchange.com/questions/441597/