Kinect eszköztár – 2.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.

A következő projekt, amit létrehozunk egy WPF Toolbox Control. Ehhez szükség van a Visual Studio 2012 SDK-ra.

Azért választottam a Toolbox Control-t, mert így a Visual Studio készít egy ProjektNév.vsix fájlt. Ennek a segítségével az elkészített User Control-ok bekerülnek a toolbox-ba, így könnyebben használhatóak.

Két User Controlra lesz szükségünk. Az egyik felelős a színes képek megjelenítéséért és mentéséért, a másik a Joint távolságokhoz kell.

Amikor egy új User Controlt adunk hozzá a projekthez, akkor két fájl jön létre. Az egyik egy xaml fájl, ami a felületet írja le, a másik a xmal-hez tartozó partial class.

Az első User Control a SaveImage, amely megjeleníti és menti a korábban létrehozott osztályokat (RgbImage, DepthImage, SkeletonImage). A felülete nagyon egyszerű, egyetlen Image-ből áll. Fontos , hogy nevezzük el magát a keretet, mert szükségünk lesz a méreteire.  Az osztályban szükség van egy ImageSize metódusra és három Source metódusra, amelyek csak paramétereikben térnek el. A feladatuk, hogy a felületen elhelyezett Image forrását beállítsák és meghívják az ImageSize metódust. Az ImageSize beállítja a kép méretét a befoglaló keret méreteire. Így ha majd az új projektben, amikor felhasználjuk az Image-et a toolbox-ból, akkor változtatható lesz a mérete, hiszen az Image mérete a keret méretével változik.  A következő metódus készíti el a fényképet, és menti az asztalra:

public void foto()
{
    DrawingVisual dv = new DrawingVisual();
    DrawingContext dc = dv.RenderOpen();
    dc.DrawImage(myImage.Source, new Rect(0, 0, myImage.Width, myImage.Height));
    dc.Close();
    RenderTargetBitmap rtb = new RenderTargetBitmap(
       (Int32)myImage.Width, (Int32)myImage.Height, 96, 96, PixelFormats.Default);
    rtb.Render(dv);

    BitmapEncoder bme = new PngBitmapEncoder();
    bme.Frames.Add(BitmapFrame.Create(rtb));
    string time = System.DateTime.Now.ToString("hh'-'mm'-'ss", CultureInfo.CurrentUICulture.DateTimeFormat);
    string myPic = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
    string path = System.IO.Path.Combine(myPic, "newPic-" + time + ".png");
    try
    {
        using (FileStream fs = new FileStream(path, FileMode.Create))
        {
            bme.Save(fs);
        }

    }
    catch (IOException exc)
    {
        MessageBox.Show(exc.Message);
    }
}

A második User Control a távolságok megjelenítésében fog segíteni. A feladata, hogy a egy felületen elhelyezett képen be lehessen jelölni a Joint-okat, és hogy kiírja a kijelölt Joint-ok távolságát a szenzortól.

A felület tehát tartalmazza a képet. Minden Joint-ra el kell helyezni egy-egy ellipszist és textbox-ot, megfelelően elnevezni és egy eseménykezelőt adni hozzá.

Az osztályban három adattag található. Egy példány a Distance osztályból, egy JointType-okat tartalmató lista, és egy bool segédváltozó. Minden eseménykezelő feladata az, hogy megvizsgálja az ellipszis színét. Ha fehért, akkor megváltoztatja sárgára és behelyezi a listába, ha sárga, akkor fehérre színezi és törli a listából.

A másik metódusa a GetDistance, amelynek az a feladata, hogy az összegyűjtött listát átadja a Distance osztály GetDistances metódusának és feldolgozza a kapott listát. Vagyis menjen végig a kapott listán egy foreach-el és a megfelelő Joint-okhoz tartozó szövegdobozba írja ki a távolságot.

Egyenlőre ennyi lenne az elkészített eszköztár, de a dolgozat előrehaladtával folyamatosan bővülni fog.

Üdvözlettel: Álb Csaba

Leave a Reply