Depth stream feldolgozása

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:

  1. 640*480
  2. 320*240
  3. 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

One thought on “Depth stream feldolgozása

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

Leave a Reply