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