A feladatom egy egyszerű wpf alkalmazás készítése, amely megjeleníti a mélységi adatokat egy színes kép formájában valamint követi a bal kezet, és leméri, hogy milyen távol van a szenzortól.
A kezdeti lépések ugyan azok, mint az előző alkalmazásnál. Az ablakban van egy Image, amely a szürkeárnyalatos képet fogja megjeleníteni, valamint két TextBox, egy a távolságnak, egy pedig az üzeneteknek.
Előssször következzenek a változók:
- WriteableBitmap: Ez lesz a kivetített és a mentett kép
- short tömb: Ebben tároljuk a nyers mélységi adatokat. Minden pixel tartalmazza a távolsági adatokat miliméterben. Ez 16 biten tárolódik. A felső 13 bit a távolság, az alsó 3 bit a játékos index.
- byte tömb: A megjelenített kép előállításához.
- Int32Rect: A kép mérete
- Skeleton: Ebben tároljuk a csontvázkövetési adatokat. Két fajtára lesz szükségünk. Egy tömbre, amely 6 darabot tárol, és egy másik Skeletonra, amely egy darabot tárol.
A sensorChooser eseménykezelőjében az első változatás:
ujKinect.DepthStream.Enable(DepthImageFormat.Resolution640x480Fps30); ujKinect.SkeletonStream.Enable();
Elsőnek a Depth Stream-et engedélyezzük, a megfelelő formátumban. A Depth Stream három formátumban érhető el:
- 640*480
- 320*240
- 80*60
A SkeletonStream engedélyezésekor is lehet paramétert megadni: a simítási paramétert. Ekkor létre kell hozni egy új változót:
var SmoothParameter = new TransformSmoothParameter { ... };
Következik az AllFramesReady eseménykezelő létrehozása, vátozók inicializálása és a Kinect elindítása.
Az AllFramesReady eseménykezelőben a ColorImageFrame helyett most két másikat használunk: A DepthImageFrame-et és a SkeletonFrame-et. Először a DepthImageFrame-ről:
using(DepthImageFrame depthFrame = e.OpenDepthFrame()) { if(dethFrame == null) { return; } //Bemásoljuk a mélységi adatokat a short tömbbe depthFrame.CopyPixelDataTo(ShortTomb); int index = 0; //A mélységi adatokból képet készítünk for(int i = 0; i< this.ShortTomb.Length; i++) { short melyseg = ShortTomb[i].Depth; byte intens = (byte((melyseg+1)&byte.MaxValue); ByteTomb[index++] = intens; ByteTomb[index++] = intens; ByteTomb[index++] = intens; ++index; } KivetitettKep.writePixels(kepMeret, ByteTomb, KivetitettKep.PixelWidth*sizeof(int), 0); }
A SkeletonFrame:
using (SkeletonFrame sFrame = e.OpenSkeletonFrame()) { if (sFrame == null) { return; } //Az összes megfigyelt játékos csontvázát bemásoljuk a tömbbe sFrame.CopySkeletonDataTo(allSkeletons); //Kiválasztjuk az aktív játékost aktivSkeleton =(from s in allSkeletons where s.TrackingState == SkeletonTrackingState.Tracked � select s).FirstOrDefault(); � if (aktivSkeleton == null) { return; } //Kiírjuk a távolságot tavolsag.Text = string.Format("Távolság = {0}", aktivSkeleton.Joints[JointType.HandLeft].Position.Z.ToString("N")); //Ha megfelelő a távolság, készítünk egy fotót. if (aktivSkeleton.Joints[JointType.HandLeft].Position.Z >= 1 && aktivSkeleton.Joints[JointType.HandLeft].Position.Z <= 1.2) { uzenet.Text = "Készül a fotó"; fotozz(); } else { uzenet.Text = "Legyen a keze egy méterre!"; } }
Az alkalmazás befejezése már teljesen hasonló az RGB alkalmazáshoz: leállítjuk a Kinect-et.
Egy mentett fotó:
Üdvözlettel: Álb Csaba
Pingback: Kinect eszköztár – 1. rész | Microsoft Innovation Center