2012-04-30 12 views
8

Sto giocando con il nuovo Kinect SDK v1.0.3.190. (altre domande correlate nello stackoverflow sono sul precedente sdk di kinect) Ottengo flussi di profondità e colore da Kinect. Quando la profondità e gli stream RGB vengono catturati con sensori diversi, c'è un disallineamento tra due frame come si può vedere di seguito.Kinect Depth and Image Frames Alignment

Solo RGB RGB

Solo Profondità Depth

Profondità & RGB RGB & Depth equally blended

ho bisogno di allinearle e c'è una funzione denominata MapDepthToColorImagePoint esattamente per questo scopo. Tuttavia non sembra funzionare. qui è un altrettanto miscelato (profondità e colore mappata) risultare sotto del quale viene creato con il seguente codice

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

dove

depthFrameData -> raw depth data (short array) 

videoBitmapData -> raw image data (byte array) 

mappedBitmapData -> expected result data (byte array) 

ordine dei parametri, risoluzione, dimensioni di matrice siano corretti (ricontrollato) .

Il risultato del codice è: depth and MapDepthToColorImagePoint

Il disallineamento continua! Ciò che è ancora peggio è che l'immagine del risultato dopo l'uso di MapDepthToColorImagePoint è esattamente la stessa dell'immagine originale.

Sarebbe gradito se qualcuno potesse aiutarmi a scoprire il mio errore o almeno a spiegarmi cos'è MapDepthToColorImagePoint (supponendo che abbia frainteso la sua funzionalità)?

risposta

1

Questo è un problema molto comune, qualcosa inerente alla matematica coinvolta per sincronizzare le due immagini poiché le due telecamere sono posizionate in due posti diversi. Un po 'come prendere i due feed video prodotti da una fotocamera 3D e provare a sincronizzarli. Saranno sempre leggermente fuori.

Due idee per la correzione:

  1. spostare manualmente i bit dall'immagine profondità si calcola.
  2. Aggiungi un motore vibratore per il Kinect per ridurre il rumore: http://www.youtube.com/watch?v=CSBDY0RuhS4 (ho trovato un motore pager semplice per essere efficace.)

Il MapDepthToColorImagePoint è per l'uso nel API Skeletal per mappare un punto scheletrica a un punto di profondità e quindi un punto dell'immagine in modo da poter mostrare i giunti sopra l'immagine RGB.

Spero che questo aiuti.

4

Questo accadrà sempre leggermente perché i due sensori sono montati in punti leggermente diversi.

Provalo:

Guardate qualche oggetto con i tuoi due occhi, poi provare a utilizzare solo l'occhio sinistro, allora solo l'occhio destro. Le cose sembrano leggermente diverse perché i tuoi due occhi non sono esattamente nello stesso posto.

Tuttavia: è possibile correggere molti problemi con alcuni codici API.

Sto usando Kinect per Windows 1.5, quindi le API sono leggermente diverse dalla 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); 
    } 
} 

Ecco le basi. Se si guarda l'esempio di greenscreen nel Kinect Developer Toolkit 1.5, questo è utile.