Con XNA, estoy mostrando un rectángulo simple que se proyecta en el piso. El proyector se puede colocar en una posición arbitraria. Obviamente, el rectángulo proyectado se distorsiona de acuerdo con la posición y el ángulo de los proyectores. Un Kinect escanea el piso buscando las cuatro esquinas. Ahora mi objetivo es transformar el rectángulo original de modo que la proyección ya no se distorsione básicamente al preformar el rectángulo.
Mi primer enfoque fue hacer todo en 2D: Primero calcule una transformación de perspectiva (usando OpenCV warpPerspective()
) desde los puntos escaneados a los puntos del rectángulo interno y aplique el inverso al rectángulo. Esto parecía funcionar, pero era demasiado lento, ya que no se podía procesar en la GPU.
El segundo enfoque fue hacer todo en 3D para usar las funciones de renderizado de XNA. Primero, mostraría un plano, escanearía sus esquinas con Kinect y mapearía los puntos 3D recibidos en el plano original. Teóricamente, podría aplicar el inverso de la transformación de perspectiva al plano, como lo hice en el enfoque 2D. Sin embargo, dado que XNA funciona con una matriz de vista y proyección, no puedo simplemente llamar a una función como warpPerspective()
y obtener el resultado deseado. Necesitaría calcular los nuevos parámetros para la vista de la cámara y la matriz de proyección.
Pregunta: ¿Es posible calcular estos parámetros y dividirlos en dos matrices (vista y proyección)? Si no, ¿hay otro enfoque que pueda usar?
warpPespective
? No estoy familiarizado con OpenCV, pero al leer el documento parece que esta función solo aplica una perspectiva a una imagen. ¿O estoy confundido? De todos modos, tal vez agregar más detalles sobre su primera implementación ayudaría.