Con XNA, sto visualizzando un semplice rettangolo che viene proiettato sul pavimento. Il proiettore può essere posizionato in una posizione arbitraria. Ovviamente, il rettangolo proiettato viene distorto in base alla posizione e all'angolo del proiettore. Un Kinect scruta il pavimento alla ricerca dei quattro angoli. Ora il mio obiettivo è quello di trasformare il rettangolo originale in modo tale che la proiezione non sia più distorta sostanzialmente pre-deformando il rettangolo.
Il mio primo approccio è stato quello di fare tutto in 2D: prima calcolare una trasformazione prospettica (usando OpenCV warpPerspective()
) dai punti scansionati ai punti del rettangolo interno e applicare l'inverso al rettangolo. Sembrava funzionare ma era troppo lento perché non poteva essere riprodotto sulla GPU.
Il secondo approccio era di fare tutto in 3D per utilizzare le funzionalità di rendering di XNA. In primo luogo, visualizzerei un piano, scansionerei i suoi angoli con Kinect e mapperei i punti 3D ricevuti sul piano originale. Teoricamente, potrei applicare l'inverso della trasformazione prospettica al piano, come ho fatto nell'approccio 2D. Tuttavia, poiché XNA funziona con una matrice di visualizzazione e proiezione, non posso semplicemente chiamare una funzione come warpPerspective()
e ottenere il risultato desiderato. Avrei bisogno di calcolare i nuovi parametri per la vista della telecamera e la matrice di proiezione.
Domanda: è possibile calcolare questi parametri e dividerli in due matrici (vista e proiezione)? In caso contrario, c'è un altro approccio che potrei usare?
warpPespective
? Non ho familiarità con OpenCV, ma leggendo il documento sembra che questa funzione applichi solo una prospettiva a un'immagine. O sono confuso? Ad ogni modo, forse aggiungere ulteriori dettagli sulla tua prima implementazione sarebbe di aiuto.