PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kinect Tiefensensor



Kampi
19.08.2013, 10:18
Heyho,

nachdem ich vor einiger Zeit eine Kinect erstanden habe, habe ich mich mal etwas mit der Programmierung in C# befasst.
Im Grunde ist es recht trivial (dafür das das Gerät doch recht komplex ist...das hat Microsoft wirklich schön gelöst wie ich finde) und ich habe auch schon ein Programm geschrieben um den DepthImageStream und den ColorImageStream darzustellen.
Jetzt habe ich ein Beispiel von Microsoft gesehen, wo sie den DepthImageStream in einen RGB Stream umwandeln und da wollte ich mir das mal genauer anschauen.
Hierfür habe ich mal auf dieser Seite hier gestöbert:

http://msdn.microsoft.com/en-us/library/jj131028.aspx

Wenn ich das nun richtig verstanden habe besteht jeder DepthImage Pixel aus 2x16Bit:

Die Distanz in Milimeter
Ein 16-Bit Player Index

Jetzt steht auf der Seite folgendes:

Each frame of the depth data stream is made up of pixels that contain the distance (in millimeters) from the camera plane to the nearest object.

Heißt das soviel wie das jeder Pixel des Streams eine Information dadrüber enthält wie weit das erste Objekt, von dem der Pixel stammt, entfernt liegt?
Und zu dem Player Index.
Wenn ich das nun richtig verstanden habe, sind diese Daten später nur für den Skeleton Tracker da, da diese signalisieren das sich dort eine oder mehrere Personen befinden?
Ist das so richtig? Wäre schön wenn mir da jemand mit ein bisschen mehr Kinect Erfahrung helfen könnte :)
Danke schon mal!

Technipion
19.08.2013, 11:46
Hallo Kampi,
in einem Punkt muss ich dir (leider) Recht geben, mit der Kinect-API hat Microsoft wirklich eine gute Lösung gefunden. Aber genug des Lobes, denn es geht schon wieder mit typischen MSDN-Formulierungen los:

Each frame of the depth data stream is made up of pixels that contain the distance (in millimeters) from the camera plane to the nearest object. An application can use depth data to track a person's motion or identify background objects to ignore.
Der Satz ist zwar richtig, aber echt schlecht formuliert. Ich habe mir ein paar Artikel reingezogen und gesehen, dass man nur bis unten lesen muss:

The depth data is the distance, in millimeters, to the nearest object at that particular (x, y) coordinate in the depth sensor's field of view.
Also auf Deutsch: Das Tiefenfeld enthält nicht die Distanz in Milimetern zum nächstgelegenen Objekt, sondern es enthält die Distanz in Milimetern zum nächstgelegenen Objekt bei den Koordinaten (x,y).

Statt das einfach so in den Artikel zu schreiben, naja...

In dem MSDN-Artikel sind wenigstens noch einige Anwendungsbeispiele mit Quellcode verlinkt :)

Gruß Technipion

Kampi
19.08.2013, 12:04
Hey,

danke für die Antwort.
Das heißt es wird zusätzlich zu der Distanz von einem Objekt auch die Koordinaten von dem Objekt ausgegeben?
Sodass der Sensor dann der Ursprung eines Koordinatensystems ist und dann eine Distanz (Z-Koordinate) und eine X und Y Koordinate ausgibt?
Dann auch gleich ne weitere Frage:
Die Funktion "MinDepth" was gibt die genau zurück?
Die Mindestdistanz die der Sensor erfasst hat? Oder die Mindestdistanz die der Sensor erfassen KANN?

Technipion
19.08.2013, 13:02
Hey zurück,
ich kann dir zu all deinen Fragen leider keine Details nennen, da ich selbst noch nie mit Kinect gearbeitet habe :)
Aber ich habe mich mal durch die MSDN-Artikel geboxt und hier meine Antworten:

1) Ja, im Grunde werden 3D-Koordinaten ausgegeben, hier ist eine Seite mit vielen Grafiken dazu: http://msdn.microsoft.com/en-us/library/hh973078.aspx#Depth_Ranges

Der Depth-Stream ist im Grunde ein Videostream, der in seinen Pixeldaten Informationen über Tiefe und Objekt enthält. Einerseits die Entfernung zu Objekt an Pixel XY, andererseits die Information, welches menschliche Subjekt sich an Pixel XY am nächsten an der Kamera befindet.
Du kannst das Format des Streams ändern: http://msdn.microsoft.com/en-us/library/microsoft.kinect.depthimageformat.aspx
Du kannst den Entfernungsbereich anpassen: http://msdn.microsoft.com/en-us/library/microsoft.kinect.depthrange.aspx
Und die Funktion MinDepth verrät dir, was die naheste Entfernung ist, die der Sensor noch erfassen kann: http://msdn.microsoft.com/en-us/library/microsoft.kinect.depthimagestream.mindepth.aspx

Hoffe ich konnte Helfen ;)

Gruß Technipion

Kampi
19.08.2013, 17:41
Hey,

ja das konntest du :). Die Seite mit den Grafiken kannte ich z.B. noch gar nicht.
Dank dir!

- - - Aktualisiert - - -

Hey,

habe es nun mal getestet.
Also minDepth und maxDepth gibt den maximal und minimal Wert der messbaren Entfernung an.
Da ich keine XBox Kinect besitze ist der Wert konstant, aber eine PC Kinect kann noch auf den "Near" Modus geschaltet werden, dadurch ändert sich der Wert natürlich.
Auch die Umrechnung von Depth auf BGR ist echt trivial....einfach gucken...ist das Pixel in der Messreichweite....wenn nicht ist es = 0 also schwarz und ansonsten weiß :)