Kinect este un dispozitiv periferic care permite utilizatorilor sa controleze un calculator sau o consola doar prin intermediul gesturiilor. Acesta a fost lansat impreuna cu XBOX 360 in 2010. In 1 februarie 2012 a fost lansata o versiunea finala a SDK-ului pentru PC. Acesta ne permite sa scriem aplicatie pentru PC care sa foloseasca senzorii de pe Kinect. Ce trebuie sublineat aici este ca acest SDK se poate folosi doar pentru aplicatii non-comerciale in cazul in care aveti un Kinect pentru XBOX si nu pentru PC.
Din punct de vedere hardware, acest device contine:
Dar haideti sa o luam cu inceputul. Pentru a putea sa folosim Kinect pe PC avem nevoie de Visual Studio 2010 si de SDK-ul de Kinect care poate sa fie downloadat de aici.
Odata instalat, putem sa adaugam referinta Microsoft.Kinect la proiectul nostru. In acest moment merita sa mentionam doua lucruri importante:
Dupa initializare, trebuie sa pornim explicit fiecare senzor pe care vrem sa il folosim. In exemplul urmator o sa pornim streamul video si o sa ne inregistram la evenimentul care este aruncat cand un nou frame este disponibil.
primii 13 biti ne dau distanta in milimetrii a punctului respectiv. Mai jos putem vedea cum sa extragem dintr-un frame distanta in milimetrii la care se afla obiectul dintr-o locatia data:
Asa cum primeam de la senzorul video cate un nou frame, exact la fel primim cate un frame de tip SkeletonFrame care contine toate punctele. In acest moment trebuie sublineat ca fiecare frame o sa contina toate punctele, chiar daca la o parte din acestea nu se poate face tracking. Daca pentru un punct s-a putut face tracking atunci propietatea TrackingState o sa fie egala cu SkeletonTrackingState.Tracked.
Fiecare punct a unui jucator se identifica unic printr-un enum de tip JointType. De exemplu capul are valorea JointType.Head, iar coloana vertebrala JointType.Spline.
Mai jos gasiti un exemplu de cod care ne permite sa iteram prin punctele la care se face tracking si sa afisam pozitia acestora:
Daca pentru XBOX 360 exista o multime de jocuri care folosesc acest device, pentru PC nu exita aproape nici o aplicatie. Cauza principal este suportul pentru PC care doar acupa a aparut dar si modul de licentiere a acestui device(SDK-ul este disponibil doar pentru uz non-comercial - daca deviceul este pentru XBOX 360). Potentialul acestui device este extreme de mare, din aceasta cauza merita studiat. El este doar la inceput si mai mult ca sigur o mai auzim de el.
Cu aceasta ocazie va invit pe data de 18 februarie la o prezentare detaliata a acetui device. Mai multe informatii puteti sa gasiti aici:
http://codecamp-cluj-2012.eventbrite.co.uk/
http://vunvulearadu.blogspot.com/2012/02/intalnire-codecamp-la-cluj-napoca-18.html
Din punct de vedere hardware, acest device contine:
- camera video de 640x480 folosita pentru capturarea imaginii
- camera cu infrarosu folosita pentru a calcula la ce distanta se afla obiectele
- un microfon pentru capturarea sunetului
Dar haideti sa o luam cu inceputul. Pentru a putea sa folosim Kinect pe PC avem nevoie de Visual Studio 2010 si de SDK-ul de Kinect care poate sa fie downloadat de aici.
Odata instalat, putem sa adaugam referinta Microsoft.Kinect la proiectul nostru. In acest moment merita sa mentionam doua lucruri importante:
- pentru a conecta Kinectul la PC avem nevoie de un adaptor( o mufa normala de USB nu furnizeaza destula energie)
- daca vrem sa avem mai multe deviceuri conectate, acestea trebuie sa fie conectate pe controale USB diferite
KinectSensor kinect = KinectSensor.KinectSensors[0];
kinect.Start();
kinect.SkeletonStream.Enable();
kinect.ColorStream.Enable();
Este foarte importat la in momentul in care aplicatia se inchide si am terminat sa folosim Kinectul sa apelam Stop(). In caz contrat sunt sanse ca la urmatoarea pornire a aplicatiei sa nu mai putem conecta la Kinect.Dupa initializare, trebuie sa pornim explicit fiecare senzor pe care vrem sa il folosim. In exemplul urmator o sa pornim streamul video si o sa ne inregistram la evenimentul care este aruncat cand un nou frame este disponibil.
kinect.ColorStream.Enable(ColorImageFormat.RgbResolution1280x960Fps12);
kinect.ColorFrameReady += new EventHandler<ColorImageFrameReadyEventArgs>(kinect_ColorFrameReady);
...
void kinect_ColorFrameReady(object sender, ColorImageFrameReadyEventArgs e)
{
ColorImageFrame frame = e.OpenColorImageFrame();
}
Pentru fiecare stream la care ne inregistram o sa fim notificati cand un nou frame este disponibil. Ce trebuie mentionat aici este cand lucram cu frameurile pentru depth. Rezultatul o sa vina tot ca si o insiruire de biti, exact la fel ca si pentru streamul video, doar caprimii 13 biti ne dau distanta in milimetrii a punctului respectiv. Mai jos putem vedea cum sa extragem dintr-un frame distanta in milimetrii la care se afla obiectul dintr-o locatia data:
void kinect_DepthFrameReady(object sender, DepthImageFrameReadyEventArgs e)
{
DepthImageFrame frame = e.OpenDepthImageFrame();
short[] pixelInfos=new short[frame.PixelDataLength];
frame.CopyPixelDataTo(pixelInf os);
int distanceInMillimeters = pixelInfos[pixelPosition] >> DepthImageFrame.PlayerIndexBitmaskWidth;
}
Un alt lucru pe care Kinectul il face automat este sa identifice unic fiecare persoana care este in fata senzorului. In acest mod putem sa izolam si sa identificam fiecare jucator. Acesta informatie se poate extrage si din frameul de mai sus in felul urmator:int playeNumber = depthFrame[pixelPosition] & DepthImageFrame.PlayerIndexBitmask;
Cea ce diferentea Kinectul de toate deviceurile care sunt pe piata in acest moment nu este ca identifica fiecare jucator separat sau calitatea imaginii video ci datele care ne sunt returnate despre fiecare jucator. Kinectul poate sa identifice mai multe puncte a fi ecarui jucator( “articulatii”). Pentru fiecare din aceste puncte ne sunt returnate pozitiile in spatiu (x,y,z). Fara sa scrim nici un algoritm, putem automat sa identificam pozitia unei persoane, daca aceasta are mana intinsa, daca sta aplecata sau daca a ridicat un picior. Mai jos gasiti punctele de pe un jucator la care se face tracking.Asa cum primeam de la senzorul video cate un nou frame, exact la fel primim cate un frame de tip SkeletonFrame care contine toate punctele. In acest moment trebuie sublineat ca fiecare frame o sa contina toate punctele, chiar daca la o parte din acestea nu se poate face tracking. Daca pentru un punct s-a putut face tracking atunci propietatea TrackingState o sa fie egala cu SkeletonTrackingState.Tracked.
Fiecare punct a unui jucator se identifica unic printr-un enum de tip JointType. De exemplu capul are valorea JointType.Head, iar coloana vertebrala JointType.Spline.
Mai jos gasiti un exemplu de cod care ne permite sa iteram prin punctele la care se face tracking si sa afisam pozitia acestora:
void kinect_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
{
SkeletonFrame frame = e.OpenSkeletonFrame();
Skeleton[] skeletons=new Skeleton[frame.SkeletonArrayLength];
frame.CopySkeletonDataTo(skeletons);
foreach (Skeleton skeleton in skeletons)
{
foreach (Joint joint in skeleton.Joints)
{
if (joint.TrackingState != JointTrackingState.Tracked)
{
continue;
}
Console.Write(joint.JointType);
Console.Write(joint.Position.X);
Console.Write(joint.Position.Y);
Console.WriteLine(joint.Position.Z);
}
}
Impreuna cu acest SDK, Kinectul devine un device foarte usor de folosit. De la o capturare de imagine, pana la calcularea distantei la care se afla un obiect sau pozitia mainii fata de corp a unei personae, totul se poate foarte usor, apeland API cu care vine insotit acest device.Daca pentru XBOX 360 exista o multime de jocuri care folosesc acest device, pentru PC nu exita aproape nici o aplicatie. Cauza principal este suportul pentru PC care doar acupa a aparut dar si modul de licentiere a acestui device(SDK-ul este disponibil doar pentru uz non-comercial - daca deviceul este pentru XBOX 360). Potentialul acestui device este extreme de mare, din aceasta cauza merita studiat. El este doar la inceput si mai mult ca sigur o mai auzim de el.
Cu aceasta ocazie va invit pe data de 18 februarie la o prezentare detaliata a acetui device. Mai multe informatii puteti sa gasiti aici:
http://codecamp-cluj-2012.eventbrite.co.uk/
http://vunvulearadu.blogspot.com/2012/02/intalnire-codecamp-la-cluj-napoca-18.html
Faina jucarie :)
ReplyDeleteNu se pot dezvolta aplicatii comerciale cu SDK-ul nici daca cumperi senzorul dedicat (Kinect for Windows) in loc de sezorul de la Xbox 360? (cam asa a minteles de la http://blogs.technet.com/b/next/archive/2012/02/01/kinect-for-windows-game-on-for-commercial-use.aspx )
Ai dreptate Tudor. In cazul in care se cumpara varianta pentru PC a acestui device.
ReplyDeleteSDK-ul si tot ce ii aferent este destul de nou inca. API a fost schimbat destul de mult fata de ce era pana acuma. Sper sa nu mai fie schimbat din nou atat de mult. Este asemanator cu ce s-a intamplat cu API de EF pana s-a ajuns la o versiune finala.