Frage an kinect, color-depth, c# – Kinect Depth und Image Frames Alignment

8

Ich spiele mit dem neuen Kinect SDK v1.0.3.190 herum. (andere verwandte fragen in stackoverflow beziehen sich auf vorherige sdk von kinect) Ich erhalte Tiefen- und Farbströme von Kinect. Da die Tiefen- und RGB-Ströme mit verschiedenen Sensoren erfasst werden, liegt eine Fehlausrichtung zwischen zwei Bildern vor, wie unten zu sehen ist.

Nur RGB

Nur die Tiefe

Tiefe & RGB

Ich muss sie ausrichten und es gibt eine Funktion namens MapDepthToColorImagePoint genau für diesen Zweck. Es scheint jedoch nicht zu funktionieren. Hier ist ein gleichmäßiges Ergebnis (Tiefe und zugeordnete Farbe), das mit dem folgenden Code erstellt wird

<code>            Parallel.For(0, this.depthFrameData.Length, i =>
        {
            int depthVal = this.depthFrameData[i] >> 3;
            ColorImagePoint point = this.kinectSensor.MapDepthToColorImagePoint(DepthImageFormat.Resolution640x480Fps30, i / 640, i % 640, (short)depthVal, ColorImageFormat.RgbResolution640x480Fps30);
            int baseIndex = Math.Max(0, Math.Min(this.videoBitmapData.Length - 4, (point.Y * 640 + point.X) * 4));

            this.mappedBitmapData[baseIndex] = (byte)((this.videoBitmapData[baseIndex]));
            this.mappedBitmapData[baseIndex + 1] = (byte)((this.videoBitmapData[baseIndex + 1]));
            this.mappedBitmapData[baseIndex + 2] = (byte)((this.videoBitmapData[baseIndex + 2]));
        });
</code>

woher

<code>depthFrameData -> raw depth data (short array)

videoBitmapData -> raw image data (byte array)

mappedBitmapData -> expected result data (byte array)
</code>

Reihenfolge der Parameter, Auflösung, Arraygrößen sind korrekt (doppelt markiert).

Das Ergebnis des Codes ist:

Die Fehlausrichtung geht weiter! Was noch schlimmer ist, ist, dass das Ergebnisbild nach Verwendung von MapDepthToColorImagePoint mit dem Originalbild identisch ist.

Wäre dankbar, wenn mir jemand helfen könnte, meinen Fehler herauszufinden oder mir zumindest erklären könnte, wofür MapDepthToColorImagePoint steht (vorausgesetzt, ich habe seine Funktionalität falsch verstanden)?

Deine Antwort

2   die antwort
4

Dies geschieht immer geringfügig, da die beiden Sensoren an geringfügig unterschiedlichen Stellen montiert sind.

Versuch es:

Schauen Sie sich ein Objekt mit Ihren beiden Augen an und versuchen Sie, nur Ihr linkes und dann nur Ihr rechtes Auge zu verwenden. Die Dinge sehen etwas anders aus, weil sich Ihre beiden Augen nicht genau an der gleichen Stelle befinden.

Es ist jedoch möglich, viele Probleme mit einigen API-Codes zu beheben.

Ich verwende Kinect für Windows 1.5, daher unterscheiden sich die APIs geringfügig von 1.0.

<code>short[] depth=new short[320*240];
// fill depth with the kinect data
ColorImagePoint[] colorPoints=new ColorImagePoint[320*240];
// convert mappings
kinect.MapDepthFrameToColorFrame(DepthImageFormat.Resolution320x240Fps30,
            depth, ColorImageFormat.RgbResolution640x480Fps30, colorPoints);
// now do something with it
for(int i=0;i<320*240;i++)
{
  if (we_want_to_display(depth[i]))
  {
    draw_on_image_at(colorPoints[i].X,colorPoints[i].Y);
  }  
}
</code>

Das sind die Grundlagen. Wenn Sie sich das Greenscreen-Beispiel im Kinect Developer Toolkit 1.5 ansehen, ist dies eine gute Verwendung.

1

Dies ist ein sehr häufiges Problem, das in der Mathematik zum Synchronisieren der beiden Bilder enthalten ist, da sich die beiden Kameras an zwei verschiedenen Orten befinden. Ein bisschen wie das Aufnehmen der beiden von einer 3D-Kamera erzeugten Video-Feeds und der Versuch, sie zu synchronisieren. Sie werden immer etwas aus sein.

Zwei Ideen zur Korrektur:

Verschieben Sie die Bits manuell aus dem Tiefenbild, während Sie es berechnen.Fügen Sie dem Kinect einen Schüttelmotor hinzu, um Geräusche zu reduzieren:http://www.youtube.com/watch?v=CSBDY0RuhS4 (Ich habe festgestellt, dass ein einfacher Pager-Motor effektiv ist.)

Der MapDepthToColorImagePoint wird in der Skeletal-API verwendet, um einen Skelettpunkt einem Tiefenpunkt und dann einem Bildpunkt zuzuordnen, sodass Sie Verbindungen über dem RGB-Bild anzeigen können.

Hoffe das hilft.

Verwandte Fragen