5 votes

La vue infrarouge de Kinect a-t-elle un décalage avec la vue en profondeur de Kinect ?

Je travaille sur un projet Kinect en utilisant la vue infrarouge et la vue en profondeur. Dans la vue infrarouge, en utilisant la bibliothèque CVBlob, je suis capable d'extraire des points d'intérêt en 2D. Je veux trouver la profondeur de ces points 2D. J'ai donc pensé que je pouvais utiliser la vue en profondeur directement, quelque chose comme ceci :

coordinates3D[0] = coordinates2D[0];
coordinates3D[1] = coordinates2D[1];
coordinates3D[2] = (USHORT*)(LockedRect.pBits)
[(int)coordinates2D[1] * Width + (int)coordinates2D[0]] >> 3;

Je ne pense pas que ce soit la bonne formule pour obtenir la profondeur. Je suis capable de visualiser les points d'intérêt 2D dans la vue en profondeur. Si j'obtiens un point (x, y) dans la vue infrarouge, je le dessine comme un point rouge dans la vue en profondeur à (x, y).
J'ai remarqué que les points rouges ne sont pas là où je les attends (sur un objet). Il y a une erreur systématique dans leur emplacement.

J'étais d'avis que la vue en profondeur et la vue infrarouge ont une correspondance biunivoque, contrairement à la correspondance entre la vue en couleur et la vue en profondeur.
Est-ce bien vrai ou y a-t-il un décalage entre les vues IR et profondeur ? S'il y a un décalage, puis-je obtenir la bonne valeur de profondeur ?

3voto

Spektre Points 4403

Les flux de profondeur et de couleur ne sont pas pris au même endroit, ils ne correspondent donc pas parfaitement les uns aux autres. Leur champ de vision est également différent.

  1. caméras

    • IR/Profondeur FOV 58.5° x 45.6°
    • FOV couleur 62,0° x 48,6°.
    • distance entre les caméras 25mm
  2. mes corrections pour la résolution 640x480 pour les deux flux

    if (valid depth)
     {
     ax=(((x+10-xs2)*241)>>8)+xs2;
     ay=(((y+30-ys2)*240)>>8)+ys2;
     }
    • x,y sont en coordonnées dans l'image de profondeur
    • ax,ay sont les coordonnées de sortie dans l'image couleur
    • xs,ys = 640,480
    • xs2,ys2 = 320,240

    comme vous pouvez le voir mon kinect a aussi un décalage en y qui est bizarre (encore plus grand que le décalage en x). Ma conversion fonctionne bien sur des plages allant jusqu'à 2 m Je ne l'ai pas mesuré davantage mais cela devrait fonctionner même dans ce cas.

  3. n'oubliez pas de corriger les coordonnées spatiales à partir des coordonnées de la profondeur et de l'image de profondeur

    pz=0.8+(float(rawdepth-6576)*0.00012115165336374002280501710376283);
    px=-sin(58.5*deg*float(x-xs2)/float(xs))*pz;
    py=+sin(45.6*deg*float(y-ys2)/float(ys))*pz;
    pz=-pz;
    • where px,py,pz est la coordonnée du point en [m] dans l'espace par rapport à kinect

    J'utilise un système de coordonnées pour la caméra avec une direction Z opposée, donc la négation du signe.

PS. J'ai l'ancien modèle 1414, les modèles plus récents ont probablement des paramètres de calibration différents.

2voto

Evil Closet Monkey Points 3874

Il n'y a pas de décalage entre la "vue IR" et la "vue en profondeur". Principalement parce qu'il s'agit de la même chose.

Le Kinect possède 2 caméras. Une caméra couleur RVB et une caméra de profondeur, qui utilise un blaster IR pour générer un champ lumineux qui est utilisé lors du traitement des données. Cela vous donne un flux vidéo couleur et un flux de données de profondeur ; il n'y a pas de "vue IR" séparée des données de profondeur.

enter image description here

UPDATE :

Il s'agit en fait de la même chose. Ce que vous appelez une "vue en profondeur" est simplement une version colorisée de la "vue IR" ; l'image en noir et blanc est la donnée "brute", tandis que l'image en couleur est une version traitée de la même donnée.

Dans le Kinect pour Windows Toolkit Jetez un coup d'œil à la KinectWpfViewers (si vous avez installé le KinectExplorer-WPF par exemple, il devrait y être). On y trouve le KinectDepthViewer et le DepthColorizer classes. Ils démontreront comment la "vue en profondeur" colorisée est créée.

UPDATE 2 :

D'après les commentaires ci-dessous, ce que j'ai dit ci-dessus est presque entièrement faux. Je vais probablement modifier ou supprimer ma réponse dans son intégralité dans un avenir proche, mais d'ici là, elle restera un témoignage de mes croyances autrefois invalides sur ce qui venait d'où.

Quoi qu'il en soit... Jetez un coup d'œil à la CoordinateMapper comme une autre solution possible. Le lien vous mènera à la documentation sur le code géré (qui m'est familier), je cherche dans la documentation sur le C++ pour voir si je peux trouver l'équivalent.

Je l'ai utilisé pour mapper la couleur standard et les vues de profondeur. Il se peut que la vue IR soit aussi bien représentée (je ne vois pas pourquoi), mais je n'en suis pas sûr à 100%.

1voto

Aparajith Sairam Points 271

J'ai créé un blog montrant les vues IR et Profondeur :

http://aparajithsairamkinect.blogspot.com/2013/06/kinect-infrared-and-depth-views_6.html

IR and Depth Views

0voto

Aparajith Sairam Points 271

Ce code fonctionne pour de nombreuses positions des trackers de la Kinect :

coordinates3D[0] = coordinates2D[0];
coordinates3D[1] = coordinates2D[1];
coordinates3D[2] = (USHORT*)(LockedRect.pBits)
[(int)(coordinates2D[1] + 23) * Width + (int)coordinates2D[0]] >> 3;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X