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