2016-05-03 21 views
1

Ich möchte den Tiefensensor des Kinect 2.0 SDK nutzen, aber nicht in dem Sinne, dass diese Daten im Format eines Bildes gezeichnet oder angezeigt werden, sondern eine Ganzzahl oder etwas Ähnliches. Ein Beispiel dafür ist, wenn ich meine Hand sehr nahe an der Kinect habe, würde ich einen ganzzahligen Wert erhalten, der mir etwa die Entfernung zwischen der Kamera und dem Hindernis angibt. vielleicht so etwas. Wenn sich das Hindernis bewegt, berechnet Kinect die Entfernung neu und aktualisiert sie möglicherweise alle Sekunden oder eine halbe Sekunde.Wie konvertiert man die Tiefendaten von einem Kinect 2.0 in einen Entfernungswert?

The distance between the kinect and the obstacle is 20 cm 
The distance between the kinect and the obstacle is 10 cm 
The distance between the kinect and the obstacle is 100 cm 

Ist das möglich? Ich suchte nach Tutorials, aber ich konnte finden, dass die Darstellung in der Regel eine Punktwolke oder Schwarz-Weiß-Tiefenbild verwendet.

+0

Die „black and white Tiefenbild“ vermutlich haben Sie den Abstand zwischen dem Kinect und ein anderes Objekt als die Helligkeit eines Pixels codiert. Können Sie erklären, warum diese Information für Ihren Zweck nicht ausreicht? – Angew

+0

Ich wusste nicht, wie man diese Daten von Bilddaten in eine Entfernung vom Kinect und nur EINES Hindernis bewegt? Jede Anleitung oder Beispielcode wäre hilfreich. Danke – user1680944

+1

Empfehlen Tutorials ist Off-Topic auf (Haupt-) SO. Sie sollten versuchen, etwas selbst zu finden, es zu verfolgen, mögliche Probleme zu untersuchen und dann mit spezifischen Fragen zurück zu kommen, wenn sie noch nicht gelöst sind. Sie können vielleicht in einem relevanten Chat nach einigen Tutorial-Zeigern etc. fragen, nicht sicher. Vielleicht möchten Sie in die Bildverarbeitung oder in die Computer Vision schauen, um ein Punktwolken-/Tiefenbild in eine aussagekräftige Bildschirmdarstellung zu konvertieren. – Angew

Antwort

2

Obwohl diese Frage schon vor einiger Zeit gestellt wurde und der Fragesteller höchstwahrscheinlich selbst dies gelöst hat, wollte ich allen anderen, die das gleiche Problem haben könnten, den C++ Code geben, um dieses Problem zu lösen.

Hinweis: Die Lösung basiert auf dem Kinect 2.0 SDK und wenn ich mich richtig erinnere, nahm ich es aus einem der Beispiele im SDK Browser 2.0, der mit dem Kinect 2.0 SDK geliefert wird. Ich habe alle speziellen Modifikationen, die ich gemacht habe, entfernt und nur die wichtigsten Aspekte zurückgelassen (also musst du wahrscheinlich die void ändern und ihr einen Rückgabeparameter geben).

Die m_pDepthFrameReader ist als IDepthFrameReader* initialisiert

void KinectFusionProcessor::getDistance() { 
IDepthFrame* frame = NULL; 
if (SUCCEEDED(m_pDepthFrameReader->AcquireLatestFrame(&frame))) { 
    int width = 512; 
    int height = 424; 
    unsigned int sz=(512*424); 
    unsigned short buf[525 * 424] = {0}; 
    frame->CopyFrameDataToArray(sz,buf); 

    const unsigned short* curr = (const unsigned short*)buf; 
    const unsigned short* dataEnd = curr + (width*height); 

    while (curr < dataEnd) { 
     // Get depth in millimeters 
     unsigned short depth = (*curr++); 
    } 
} 
if (frame) frame->Release(); 
} 
1

Das ist ziemlich einfach. Ich kenne den genauen Code in C++ nicht, aber in C#, sobald Sie den Tiefenrahmen haben, müssen Sie folgendes tun: Ich nehme an, dass Sie bereits wissen, dass Y und X zeigen, wo Sie den Tiefenwert auswerten möchten.

Sobald Sie das wissen, müssen Sie zuerst jedes Byte des Tiefenrahmens in ushort konvertieren.

Danach müssen Sie den Index innerhalb der depthPixels berechnen, der Ihrem X- und Y-Punkt entspricht. Typischerweise ist dies die verwendete Gleichung:

// Get the depth for this pixel 
ushort depth = frameData[y * depthFrameDescription.Height + x]; 

Ich hoffe, das kann hilfreich sein.

+0

Ich glaube, es ist tatsächlich '(y * Breite) + x', wenn ich mich nicht irre. –

2

Die Kinect verwendet tatsächlich eine Punktwolke. Und jedes Pixel in der Punktwolke hat einen vorzeichenlosen kurzen Ganzzahlwert, der die Entfernung in mm von Kinect darstellt. Von dem, was ich sagen kann, ist die Kamera bereits in der Lage zu kompensieren oder Objekte zu den Seiten seiner Ansicht ist weiter weg dann was ist vor, so dass alle Daten die Tiefe darstellt jene Objekte sind weg von der Ebene der Kinects Kamera aus betrachtet. Der Kinect zeigt bis zu 8m an, hat aber nur verlässliche Daten zwischen 4-5m und kann nichts näher als 0.5m sehen. Da es sich anhört, als ob Sie es als Hinderniserkennungssystem verwenden würden, würde ich vorschlagen, alle Datenpunkte in der Punktwolke zu überwachen und gruppierte Datenpunkte auszumachen, die sich von anderen unterscheiden und sie als eigene Objekte mit einer ungefähren Entfernung interpretieren. Der Kinect wird auch mit 30 Bildern pro Sekunde aktualisiert (vorausgesetzt, Ihre Hardware kann den intensiven Datenstrom verarbeiten). Sie überwachen Ihre Punktwolke einfach ständig auf Objekte, die die Entfernung ändern.

Wenn Sie mit dem Herunterladen von SDK und Kinect Studio beginnen, können Sie die Tiefe/IR-Programmierbeispiele und das Studio verwenden, um ein besseres Verständnis dafür zu erhalten, wie die Daten verwendet werden können.