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
Pingback: Kinect eszköztár – 1. rész | Microsoft Innovation Center