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.Respuestas:
Dado que el álgebra vectorial es compatible con GPU, se pueden usar normalizaciones y productos de puntos para encontrar las cuatro esquinas del plano original de la siguiente manera:
Dado el punto del proyector (P), el punto proyectado (B), un punto arbitrario en el plano que contiene el rectángulo distorsionado (Q) y el vector normal a ese plano (n), el punto de intersección (A) del línea de P a B, y el plano viene dado por
Fuente http://geomalgorithms.com/a05-_intersect-1.html sección Intersección línea-plano
fuente