2012-04-30 11 views
8

Ich spiele um mit neuen Kinect SDK v1.0.3.190. (andere verwandte Fragen in Stackoverflow sind auf vorherigen Sdk von Kinect) Ich bekomme Tiefen- und Farbströme von Kinect. Da die Tiefen- und RGB-Ströme mit unterschiedlichen Sensoren erfasst werden, besteht eine Fehlausrichtung zwischen zwei Bildern, wie unten zu sehen ist.Kinect Tiefe und Bildrahmen Ausrichtung

Nur RGB RGB

Nur Tiefe Depth

Tiefe & RGB RGB & Depth equally blended

ich brauche, um sie auszurichten und es gibt eine Funktion namens MapDepthToColorImagePoint genau für diesen Zweck. Es scheint jedoch nicht zu funktionieren. hier ist eine gleich blended (Tiefe und kartiert Farbe) führen, unter der mit dem folgenden 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])); 
     }); 
erstellt wird

wo

depthFrameData -> raw depth data (short array) 

videoBitmapData -> raw image data (byte array) 

mappedBitmapData -> expected result data (byte array) 

Reihenfolge der Parameter, die Auflösung, Arraygrößen richtig sind (doppelt geprüft) .

Das Ergebnis des Codes ist: depth and MapDepthToColorImagePoint

Die Verlagerung geht weiter! Noch schlimmer ist, dass das Ergebnisbild nach der Verwendung von MapDepthToColorImagePoint genau dem Originalbild entspricht.

Ich würde mich freuen, wenn jemand mir helfen könnte, meinen Fehler zu finden oder mir zumindest erklären zu können, was MapDepthToColorImagePoint ist (vorausgesetzt, dass ich seine Funktionalität missverstanden habe)?

Antwort

1

Dies ist ein sehr häufiges Problem, etwas, das in die Mathematik involviert ist, um die beiden Bilder zu synchronisieren, da die beiden Kameras an zwei verschiedenen Orten sitzen. So wie man die zwei von einer 3D-Kamera produzierten Video-Feeds nimmt und versucht, sie zu synchronisieren. Sie werden immer etwas abseits sein.

Zwei Ideen zur Korrektur:

  1. manuell die Bits aus dem Tiefenbild verschieben, wie Sie es berechnet wird.
  2. hinzufügen Schüttelmotor zum Kinect Rauschen zu reduzieren: http://www.youtube.com/watch?v=CSBDY0RuhS4

einen Skelettpunktes zur Karte in der Skeletal API verwenden (. Ich habe einen einfachen Pager Motor als wirksam erwiesen) Die MapDepthToColorImagePoint ist zu ein Tiefenpunkt und dann zu einem Bildpunkt, so dass Sie Gelenke über das RGB-Bild zeigen können.

Hoffe, das hilft.

4

passieren Dies wird immer leicht, weil die beiden Sensoren mit leicht unterschiedlichen Orten angebracht sind.

Versuchen Sie es:

Blick auf einige Objekt mit beiden Augen, dann versuchen Sie nur das linke Auge, dann nur dein rechtes Auge mit. Die Dinge sehen etwas anders aus, weil deine zwei Augen nicht an genau der gleichen Stelle sind.

Allerdings: Es ist möglich, viele Probleme mit einigen der API-Codes zu korrigieren.

Ich verwende Kinect für Windows 1.5, also sind die APIs etwas anders als die 1.0.

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); 
    } 
} 

Das sind die Grundlagen. Wenn Sie sich das Greenscreen-Beispiel im Kinect Developer Toolkit 1.5 ansehen, zeigt es einen guten Nutzen dafür.