A Kinect RGB kamerájának használata

Szeretném bemutatni a Kinect kamerájának használatát egy egyszerű wpf alkalmazás segítségével. Az alkalmazás feladata az, hogy fogadja a Kinect kamerájától érkező adatokat, feldolgozza, megjelenítse és lementsen egy képet az asztalra.

A felhasznált referenciák: A Microsoft.Kinect és a Microsoft.Kinect.ToolKit.

Először elkészítjük az ablakot. Szükségünk lesz két Image-re egy gombra és egy KinectSensorChooserUI-ra. Az egyik kép a kamera képét fogja megjeleníteni, a másik az elkészült fényképet. A gomb a fotó készítését hajtja végre. A KinectSensorChooserUI pedig automatikusan megtalálja a Kinect-et és kezeli az állapotváltozásait.

Létre kell hozni a KinectSensorChooser osztályból egy új példányt. Szükségünk lesz még négy változóra: két WriteableBitmap-re, egy Int32Rect-re és egy byte tömbre.

Az első eseménykezelő az ablak betöltésekor hívódik meg. Itt végezzük le a KinectSensorChooser inicializálását, hozzárendeljük az eseménykezelőt és elindítjuk.

A KinectSensorChooser-hez rendelt eseménykezelő feladata, hogy a Kinect állapotváltozásait lekezelje, mint ha nincs csatlakoztatva, vagy kihúzzuk a Kinect-et és tudassa a felhasználóval a változást. Először létrehozunk két szenzort: egyet a régi Kinect-hez és egyet az újhoz.

//KinectChangedEventArgs e
var regiKinect = e.OldSensor;
var ujKinect = e.NewSensor;

Megvizsgáljuk a szenzorokat: lekezeljük, hogy ha van régi és azt, ha nincs új. Ezután engedélyezzük az ujKinect-hez tartozó ColorStream-et és hozzárendeljük az AllFramesReady eseménykezelőt:

ujKinect.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30)

A képi adatok több formában és felbontásban elérhetőek:

  • RGB:  RgbResolution640x480Fps30, RgbResolution1280x960Fps12
  • YUW:  RawYuvResolution640x480Fps15
  • Bayer: RawBayerResolution1280x960Fps12, RawBayerResolution640x480Fps30

Végül jönnek a változók inicializálásai és a Kinect elindítása:

  • A kamera képe egy writeableBitmap: A szélességének és magasságának megadá-sakor használjuk a KinectSensor.ColorStream.FrameWidth és FrameHeight-et. A horizontális és vertikális dpi 96. A pixelformátum pedig Bgr32
  • A kép méretét Int32Rect-ben tároljuk. A szélesség és a magasság megadásához itt is használjuk a FrameWidth és FrameHeight-et.
  • A bájttömb mérete pedig a KinectSensor.ColorStream.FramePixelDataLength-el adjuk meg.

Az allFramesReady eseménykezelőben csak annyi dolgunk maradt, hogy létrehozzunk egy ColorImageFrame-et, megkapjuk a legutóbbi frame színadatait, másoljuk a ColorImageFrame-ből az adatokat a bájttömbe és meghívjuk a WriteableBitmap writePixels metódusát.

using(ColorImageFrame colorFrame = e.OpenColorImageFrame())
{
  if(colorFrame == null)
  {
    return;
  }
  colorFrame.CopyPixelDataTo(bajtTomb);
  kameraKep.WritePixels(KepMeret, bajtTomb, kameraKep.PixelWidth*sizeof(int),0);
  kameraImage.Source = kameraKep;
}

Az utolsó eseménykezelő az ablak bezárása. Itt nincs más dolgunk, mint leállítani a szenzort, meghívni a StopKinect metódust:

private void StopKinect(KinectSensor s)
{
   if(s != null)
   {
     if(s.IsRunning)
     {
       s.Stop();
     }
   }
}

A kép mentése: egy PngBitmapEncoder és egy FileStream segítségével egyszerűen lementjük a képet az asztalra.

Üdvözlettel: Álb Csaba

One thought on “A Kinect RGB kamerájának használata

  1. Pingback: Kinect eszköztár – 1. rész | Microsoft Innovation Center

Leave a Reply