Avec XNA, j'affiche un simple rectangle qui est projeté sur le sol. Le projecteur peut être placé dans une position arbitraire. De toute évidence, le rectangle projeté est déformé en fonction de la position et de l'angle du projecteur. Un Kinect scanne le sol à la recherche des quatre coins. Mon objectif est maintenant de transformer le rectangle d'origine de telle sorte que la projection ne soit plus déformée par une pré-déformation du rectangle.
Ma première approche a été de tout faire en 2D: d'abord calculer une transformation en perspective (en utilisant OpenCV warpPerspective()
) des points numérisés aux points du rectangle interne et appliquer l'inverse au rectangle. Cela semblait fonctionner mais était trop lent car il ne pouvait pas être rendu sur le GPU.
La deuxième approche consistait à tout faire en 3D afin d'utiliser les fonctionnalités de rendu de XNA. Tout d'abord, j'afficherais un avion, balayerais ses coins avec Kinect et mapperais les points 3D reçus au plan d'origine. Théoriquement, je pourrais appliquer l'inverse de la transformation de perspective au plan, comme je l'ai fait dans l'approche 2D. Cependant, puisque XNA fonctionne avec une matrice de vue et de projection, je ne peux pas simplement appeler une fonction telle que warpPerspective()
et obtenir le résultat souhaité. J'aurais besoin de calculer les nouveaux paramètres pour la matrice de vue et de projection de la caméra.
Question: Est-il possible de calculer ces paramètres et de les diviser en deux matrices (vue et projection)? Sinon, existe-t-il une autre approche que je pourrais utiliser?
warpPespective
? Je ne connais pas OpenCV, mais en lisant le document, il semble que cette fonction applique simplement une perspective à une image. Ou suis-je confus? Quoi qu'il en soit, il serait peut-être utile d'ajouter plus de détails sur votre première implémentation.