Quelle est la précision de la caméra de profondeur dans le kinect?
Je voudrais surtout savoir:
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 ...
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.
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:
En mode proche:
Pour la caméra couleur, vous pouvez avoir l'une des résolutions suivantes:
Pour la caméra de profondeur, vous pouvez avoir l'une des résolutions suivantes:
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:
Pour la caméra de profondeur:
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.
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.
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 .
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.
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.
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.