Kinect eszköztár – 1. rész

Annak elkerülésére, hogy ugyan azt a kódot minden alkalmazásba le kelljen írni, dll-eket hozunk létre, amiket majd csak hozzá kell adnunk a megfelelő projekt referenciáihoz.

Először is kell egy Blank Solution. Ebbe helyezzük majd a megfelelő projekteket. Hozzunk létre Solution Folder-eket, hogy tagolt és átlátható legyen a projekt.

Az első projekt típusa Class Library. Ebbe a projektbe kerülnek a megjelenítésért felelős osztályok:

  • Depth Image
  • Rgb Image
  • Skeleton Image
  • Distance

Az RgbImage osztály tartalmazza a már leírt változókat (A színes kamera alkalmazásnál leírtakat). Nagy vonalakban egy WriteableBitmap, Int32Rect, és egy byte tömb. A konstruktor paraméterül kapja az aktuális szenzort, hogy ez alapján tudja inicializálni a változókat. Egyetlen metódusa a ColorFrameToImage, paramétere az AllFramesReadyEventArgs. A metódus feladata, hogy feldolgozza a ColorImageFrame-et, és WriteableBitmap-be másolja az adatokat.

A DepthImage osztály öröklődik az RgbImage osztályból, mert itt is egy színes képet akarunk megjeleníteni. A változói a korábban leírtakkal egyeznek meg. Konsturktorának egyetlen paramétere a szenzor. Meghívja az ős konstruktort, és inicializálja a short tömböt.
Egyetlen metódusa a DepthFrameToImage, amelynek paramétere AllFramesReadyEventArgs. Működése megegyezik a korábban írtakkal.

A SkeletonImage osztály feladata, hogy feldolgozza a SkeletonFrame-et, és hogy megjelenítse a követett játékos vázát.
Változói:

  •  RgbImage – Az általunk létrehozott színes kép osztály. Erre azért van szükség, mert a vázat a színes képre fogom kirajzolni.
  • Skeleton tömb: A Kinect egyszerre 6 játékos vázát tudja érzékelni, de csak 2 játékost tud követni.
  • Skeleton: Egy darab Skeleton, a követett játékos vázának.
  • DrawingGroup: A Skeleton kirajzolásához
  • DrawingImage: A Skeleton kirajzolásához
  • KinectSensor
  • Egy bool változó: Ebben tároljuk, hogy minden Joint állapota tracked-e

A konstruktor egyetlen paramétere a szenzor.

Metódusai: Van egy fő metódus, a SkeletonFrameToImage, és vannak segédmetódusok, amik a rajzolásért felelősek.

public void SkeletonFrameToImage(AllFramesReadyEventArgs e)
{
    //A ColorImageFrame feldolgozása a ColorImage változóba
    ColorImage.ColorFrameToImage(e);
    using (SkeletonFrame sf = e.OpenSkeletonFrame())
    {
        if (sf == null)
        {
            return;
        }
        //A SkeletonFrame-ből az adatokat a Skeleton tömbbe másoljuk
        sf.CopySkeletonDataTo(AllSkeletons);

        //Kiválasztjuk a követendő játékost
        TrackedSkeleton = (from s in AllSkeletons
                        where s.TrackingState == SkeletonTrackingState.Tracked
                        select s).FirstOrDefault();

        //Skeleton rajzolása
        using (DrawingContext dc = this.MyDrawingGroup.Open())
        {
            //A ColorImage-ből készítünk egy hátteret
            dc.DrawImage(ColorImage.RGBPicture, new Rect(0, 0, 640, 480));

            //Ha megfelelő, akkor rajzolunk
            if (TrackedSkeleton != null && TrackedSkeleton.TrackingState == SkeletonTrackingState.Tracked)
            {
                this.SkeletonDraw(TrackedSkeleton, dc);
            }
            this.MyDrawingGroup.ClipGeometry = new RectangleGeometry(new Rect(0, 0, 640, 480));
        }

    }
}

A SkeletonDraw metódus paraméterül kap egy Skeletont és egy DrawingContext-et. A metódus feladata, hogy meghívja a BoneDraw metódust a Skeleton összes Jointjára, mégpedig a következő formában:
BoneDraw(Skeleton skel, DrawingContext dc, JointType Honnan, JointType Hova).
Továbbá feladata az, hogy egy foreach-el bejárja a Skeleton Jointjait, és beállítsa a JointTrackingState alapján a   Brush-t a rajzoláshoz, valamint hogy kirajzolja az ellipsziseket a Jointok helyére.

A BoneDraw metódus feladata hogy kirajzolja a “csontot”. Paraméterei: egy Skeleton, egy DrawingContext, és két JointType, a honnan és a hova. A metódus lényegében ellenőrzi, hogy a Joint-ok állapota Tracked-e. Ha igen, akkor kirajzolja a vonalat a két Joint közé.

Az utolsó metódus egy segédmetódus, amelynek a feladata, hogy a kapott SkeletonPoint-ból készítsen egy új Point-ot. Először is kell egy CoordinateMapper. Azután létrehozunk egy új ColorImagePoint-ot a CoordinateMapper MapSkeletonPointToColorPoint metódusával.

A Distance osztályhoz kell egy segéd osztály, ami tárolásra fog szolgálni. Ebben a segédosztályban van egy float, a távolság tárolásához és egy JointType, hogy tudjuk, hogy melyik jointról van szó.

A Distance osztály két adattagja: egy Skeleton tömb és egy Skeleton. Az Init metódus feladata, hogy feldolgozza a SkeletonFrame-et és hogy feltöltse az adattagokat. A GetDistances metódus feladata, pedig a távolság kiszámítása. Paramétere egy JointType-okból álló lista, visszatérési értéke is egy lista, a távolságokról.

public List<MyDistanceHelper> GetDistances(List<JointType> list)
{
    List<MyDistanceHelper> distances = new List<MyDistanceHelper>();
    if (TrackedSkeleton != null)
    {
        foreach (JointType type in list)
        {
            distances.Add(new MyDistanceHelper(TrackedSkeleton.Joints[type].Position.Z, type));

        }
    }
    return distances;
}

Ezek az osztályok kerülnek class library-ba.

Üdvözlettel: Álb Csaba

 

Leave a Reply