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% 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 .:
falls Ihre maximale Tiefe 2048 ist, ersetzen Sie die 4095 durch 2047.
Weitere Hinweise:
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. 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 Zuerst initialisiere ich ein Hier definiert Der Code wo ich das mache ist wie folgt: Ich hoffe, das hilft dir irgendwie. convertTo
function für Mat
Mat
für die Erfassung von Tiefendaten XN_VGA_Y_RES, XN_VGA_X_RES
die Auflösung der erfassten Tiefenkarte. depthMD
sind Metadaten, die die vom Kinect-Sensor abgerufenen Daten enthalten.
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.
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.
Tags und Links opencv kinect kinect-sdk