web-dev-qa-db-fra.com

Précision de la caméra de profondeur kinect

Quelle est la précision de la caméra de profondeur dans le kinect?

  • intervalle?
  • résolution?
  • bruit?

Je voudrais surtout savoir:

  • Existe-t-il des spécifications officielles à ce sujet de Microsoft?
  • Existe-t-il des articles scientifiques sur le sujet?
  • Enquêtes de TechBlogs?
  • Des expériences personnelles faciles à reproduire?

Je collecte des données depuis environ un jour maintenant, mais la plupart des auteurs ne nomment pas leurs sources et les valeurs semblent très différentes ...

38
Fabian
  • Portée: ~ 50 cm à 5 m. Peut se rapprocher (~ 40 cm) par endroits, mais ne peut pas avoir une vue complète <50 cm.
  • Résolution horizontale: 640 x 480 et champ de vision vertical de 45 degrés et champ de vision horizontal de 58 degrés. La géométrie simple montre est d'environ ~ 0,75 mm par pixel x par y à 50 cm, et ~ 3 mm par pixel x par y à 2 m.
  • Résolution en profondeur: ~ 1,5 mm à 50 cm. Environ 5 cm à 5 m.
  • Bruit: environ + -1 DN à toutes les profondeurs, mais DN à la profondeur n'est pas linéaire. Cela signifie + -1 mm près et + - 5 cm loin.

Il existe des spécifications officielles du développeur du capteur, pas de Microsoft. Pas d'articles scientifiques à ma connaissance. Beaucoup d'enquêtes et d'expériences (voir Google). OpenKinect a beaucoup plus de discussions sur ces choses que ce site pour l'instant.

25
mankoff

Le SDK Kinect pour Windows fournit des constantes que j'utilise et semblent cohérentes. Pour plage et résolution , ces valeurs sont:

En mode par défaut:

  • Portée minimale: 80 cm
  • Portée maximale: 400 cm

En mode proche:

  • Portée minimale: 40 cm
  • Portée maximale: 300 cm

Pour la caméra couleur, vous pouvez avoir l'une des résolutions suivantes:

  • 80x60
  • 320x240
  • 640x480
  • 1280x960

Pour la caméra de profondeur, vous pouvez avoir l'une des résolutions suivantes:

  • 80x60
  • 320x240
  • 640x480

En confrontant les informations de Avada Kedavra (et de la plupart des sources, soit dit en passant), les valeurs du champ de vision données par l'API sont les suivantes:

Pour la caméra couleur:

  • FOV horizontal: 62,0 °
  • FOV vertical: 48,6 °

Pour la caméra de profondeur:

  • FOV horizontal: 58,5 °
  • FOV vertical: 45,6 °

Source: http://msdn.Microsoft.com/en-us/library/hh855368

12
Guilherme

La vraie question ici concernait la résolution et la précision. Je tiens à apporter ma contribution ici car je trouve que la résolution et la précision ne sont pas aussi bonnes que celles indiquées. La sortie maximale de la résolution en profondeur est en effet 640x480, cependant, ce n'est pas la résolution effective, et ce n'est pas exactement sa précision.

La méthode de travail du kinect est basée sur une projection de lumière structurée. Un motif de lumière est émis et projeté sur la surface, qu'une caméra voit puis triangule chaque rayon de l'Origine, rebondi sur l'objet, vers la caméra.

Le fait est que ce motif ne comprend que 34.749 points lumineux qui peuvent être triangulés ( http://azttm.wordpress.com/ 2011/04/03/kinect-pattern-uncovered / ). Si nous relions cela à une résolution de 640x480 = 307.200 points de données, nous remarquons une grande différence. Demandez-vous si la quantité de données 10 fois la quantité de points de données source peut être considérée comme valide et échantillonnée efficacement. J'en doute. Si vous me demandiez quelle est la résolution effective du kinect, je suppose qu'elle se situe autour 240x180 de données honnêtes et plutôt bonnes.

7
TimZaman

Selon les spécifications techniques de Kinect ont finalement été révélées les spécifications pour le champ de profondeur sont (ces correspondances sont également confirmées dans le guide de programmation officiel publié par Mannimarco):

* Horizontal field of view: 57 degrees
* Vertical field of view: 43 degrees
* Physical tilt range: ± 27 degrees
* Depth sensor range: 1.2m - 3.5m
* Resolution depth stream: 320x240 pixels
* Resolution color stream: 640x480 pixels

Mais d'après ma propre expérience, la gamme de capteurs de profondeur ressemble plus à 0.8m-4.0m, au moins j'obtiens une bonne lecture dans cette gamme. Cette gamme correspond à la fiche technique Primesense publiée par mankoff dans les commentaires ci-dessous.

Il est également important de se rappeler que la résolution en profondeur est beaucoup plus élevée près du capteur que plus loin. À 3-4 mètres, la résolution n'est pas aussi proche bon à 1,5 m. Cela devient important si, par exemple, vous souhaitez calculer les normales de la surface. Le résultat sera meilleur plus près du capteur que plus loin.

Ce n'est pas trop difficile de tester la gamme vous-même. Le SDK officiel (actuellement bêta) vous donnera une profondeur nulle (0) lorsque vous êtes hors de portée. Ainsi, vous pouvez tester cela avec une règle simple et tester à quelle distance vous obtenez/n'obtenez pas de lecture supérieure à zéro. Je ne sais pas comment le SDK OpenKinect gère les lectures hors plage.

Un commentaire sur le bruit: je dirais qu'il y a pas mal de bruit dans le flux de profondeur ce qui rend plus difficile le travail avec. Par exemple, si vous calculez les normales de surface, vous pouvez vous attendre à ce qu'elles soient un peu "nerveuses", ce qui aura bien sûr un impact négatif sur le faux éclairage, etc. De plus, vous avez un problème de parallaxe dans le flux de profondeur en raison de la distance entre l'émetteur infrarouge. et le récepteur. Cela peut également être difficile à travailler car cela laisse une grande "ombre" dans les données de profondeur. Cette vidéo youtube illustre le problème et discute d'un moyen de résoudre le problème à l'aide de shaders. C'est une vidéo à regarder.

5
Avada Kedavra

Je pense qu'il vaut la peine de mentionner l'article de Khoshelham et Elbernik qui a proposé un modèle théorique d'erreur aléatoire du capteur de profondeur kinect en février 12. Il est appelé "Précision et résolution des données de profondeur Kinect pour les applications de cartographie en intérieur". Le document peut être trouvé ici .

2
SemtexB

Si vous recherchez quelque chose publié par Microsoft, consultez la page 11 du Guide de programmation Kinect . Cela dit à peu près la même chose que tout le monde ici a déjà mentionnée.

  • Portée: 1,2 à 3,5 mètres
  • Angle de vision: 43 ° vertical par 57 ° horizontal
  • Plage d'inclinaison mécanisée: ± 28 °
  • Fréquence d'images: 30 images par seconde
  • Résolution, flux de profondeur: 320 x 240 (il peut en fait aller plus haut)
  • Résolution, flux de couleurs: 640 x 480 (encore une fois, il peut aller plus haut)

Je ne vois rien mentionner de bruit, mais je peux dire que c'est assez minime sauf le long des bords de la surface où il peut devenir plus perceptible.

1
Coeffect

D'après mon expérience, ce n'est pas si exact. C'est assez bien, mais lorsque vous le comparez à un ruban à mesurer, il ne correspond pas exactement. J'ai fait un Excel avec des mesures pour chaque 10 mm, et il ne tient tout simplement pas, surtout les choses qui sont à plus de 2500 mm, mais plus près aussi.

Gardez également à l'esprit que la profondeur réelle des pixels est beaucoup plus faible que celle annoncée. L'électronique à l'intérieur remplit les halètements, c'est pourquoi vous voyez des artefacts de petite zone, et non quelque chose comme des données de pixels. En substance, cela signifie que 320x240 a 1/8 pixels couverts par une mesure "réelle", les autres pixels sont calculés. Vous pouvez donc utiliser 640x480; mais cela ne serait qu'une ressource CPU/UBS et ne rendrait pas votre application plus visible.

C'est juste mes deux cents d'expérience, je programme la robotique.

1
user613326