Correction de la distorsion trapézoïdale à l'aide de points 3D de Kinect


15

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?


1
XNA utilise une vue et une matrice de projection, mais je pense que le résultat final = vecteur * vue * projection. Pourquoi ne pas essayer de faire voir une matrice d'identité et de projeter la matrice de perspective inverse et voir si cela fonctionne? (Pas sûr à 100% que c'est exactement ce qui se passe)
Roy T.

1
Comment avez-vous calculé exactement une transformation de perspective 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.
Laurent Couvidou

Vous voudrez peut-être jeter un œil à la bibliothèque PCL ( pointclouds.org ). La conversion de l'image de profondeur à partir du kinect vous donne un nuage de points avec la caméra à l'origine, pointant le long de l'axe z. Vous pouvez ensuite utiliser ransac ou un autre algorithme pour rechercher l'avion.
Exilyth

Réponses:


1

Étant donné que l'algèbre vectorielle est compatible avec le GPU, les normalisations et les produits scalaires peuvent être utilisés pour trouver les quatre coins du plan d'origine comme suit:

entrez la description de l'image ici

Étant donné le point du projecteur (P), le point projeté (B), un point arbitraire sur le plan qui contient le rectangle déformé (Q) et le vecteur normal à ce plan (n), le point d'intersection (A) du ligne de P à B, et le plan est donné par

s = -dot_product(n, P - Q) / dot_product(n, normalized(B - P)) 
A = P + s * normalized(B-P)

Source http://geomalgorithms.com/a05-_intersect-1.html section Intersection plan-ligne

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.