Kinect-Tiefenbild

8

In meiner Anwendung erhalte ich den Tiefenrahmen ähnlich dem Tiefenrahmen, der von Tiefengrundbeispiel abgerufen wurde. Was ich nicht verstehe ist, warum gibt es diskrete Ebenen im Bild? Ich weiß nicht, wie ich diese plötzlichen Änderungen der Tiefenwerte bezeichnen soll. Offensichtlich ist meine Hälfte meiner rechten Hand ganz schwarz und meine linke Hand scheint in 3 solcher Ebenen aufgeteilt zu sein. Was ist das und wie entferne ich das?

Kinect Depth Basics Beispiel http://i46.tinypic.com/2hwekxd.jpg

Wenn ich die KinectExplorer Sample App starte, bekomme ich die Tiefe wie folgt. Dies ist das Tiefenbild, das ich aus den Rohtieftendaten erzeugen möchte.

Kinect Explorer http://i50.tinypic.com/2rwx1z5.jpg

Ich verwende Microsoft Kinect SDK (v1.6) NuiApi zusammen mit OpenCV. Ich habe den folgenden Code:

%Vor%     
thinkquester 31.10.2012, 16:45
quelle

4 Antworten

5

Die Streifen, die Sie sehen, sind auf die wrapping der Tiefenwerte zurückzuführen, die durch die Operation %256 verursacht werden. Anstatt die Modulo-Operation ( %256 ) anzuwenden, die das Anzeigen der Bänder verursacht, ordnen Sie die Tiefenwerte über den gesamten Bereich neu an, z. B .:

%Vor%

falls Ihre maximale Tiefe 2048 ist, ersetzen Sie die 4095 durch 2047.

Weitere Hinweise:

  1. der Kinect liefert vermutlich einen 11bit-Wert (0-2047), aber Sie verwenden nur 8bit (0-255).
  2. neue Kinect-Versionen scheinen einen 12bit-Wert (0-4096)
  3. zurückzugeben
  4. Im Kinect-Explorer-Quellcode gibt es eine Datei namens DepthColorizer.cs , in der der Großteil der Magie zu passieren scheint. Ich glaube, dass dieser Code die Tiefenwerte im kinect explorer so glatt macht - aber ich könnte mich irren.
memyself 02.11.2012 10:57
quelle
1

Ich hatte das gleiche Problem, als ich an einem Projekt arbeitete, bei dem es um die Visualisierung der Tiefenkarte ging. Allerdings habe ich OpenNI SDK mit OpenCV anstelle von Kinect SDK-Bibliotheken verwendet. Das Problem war das gleiche und daher wird die Lösung für Sie genauso funktionieren wie für mich.

Wie in früheren Antworten auf Ihre Frage erwähnt, ist Kinect Depth Map 11-Bit (0-2047). In Beispielen werden 8-Bit-Datentypen verwendet.

Was ich in meinem Code getan habe, um das zu umgehen, war, die Tiefenkarte in eine 16-Bit-Matte zu übernehmen und sie dann in 8-Bit-Mat zu konvertieren, indem man Skalierungsoptionen in convertTo function für Mat

Zuerst initialisiere ich ein Mat für die Erfassung von Tiefendaten

%Vor%

Hier definiert XN_VGA_Y_RES, XN_VGA_X_RES die Auflösung der erfassten Tiefenkarte.

Der Code wo ich das mache ist wie folgt:

%Vor%

depthMD sind Metadaten, die die vom Kinect-Sensor abgerufenen Daten enthalten.

Ich hoffe, das hilft dir irgendwie.

    
masad 02.11.2012 18:41
quelle
0

Die Visualisierung der Tiefenbilddaten hat diskrete Ebenen, die grob sind (0 bis 255 in Ihrem Codebeispiel), aber die tatsächlichen Tiefenbilddaten sind Zahlen zwischen 0 und 2047. Immer noch diskret, aber nicht so grob Einheiten als die Farben gewählt, um sie darzustellen.

    
Erik Hermansen 01.11.2012 05:19
quelle
0

Der Kinect v2 kann eine Tiefe von 8 Metern sehen (aber die Genauigkeit über 4,5 hinaus). Es beginnt um 0,4 Meter. Man muss also eine Zahl von 8000 zu einer Farbe ausdrücken. Ein Weg, dies zu tun ist, verwenden Sie RGB-Farben nur eine Zahl. Dann könnten Sie möglicherweise eine Zahl wie 255 x 255 x 255 Pixel speichern. Oder wenn Sie ein anderes Farbformat hätten, wäre es anders. Das Speichern von 8000 in dieser maximalen 255x255x255-Nummer führt zu einer bestimmten Anzahl von R + G + B, und das ergibt diesen Banding-Effekt.

Aber Sie könnten natürlich 8000 teilen oder eine Zahl subtrahieren oder über einen bestimmten Wert hinaus entfernen.

    
user3800527 12.03.2016 22:04
quelle

Tags und Links