Skip to main content

Kinect SDK preview

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:
  • 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
Camera cu infrarosu este cea care diferentiaza acest device de orice alt device de pe piata. Aceasa ne permite sa putem stii cu precizie la ce distanta se afla fiecare obiect. SDK-ul care este disponibil in acest moment nu ne permite doar sa capturam imagii si sa calculam distante fata de camera. In mod automat acesta identifica fiecare utilizator care este in fata deviceului separat si ne ofera date despre pozitia acestuia.
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
Pentru a putea accesa datele de pe Kinect, este nevoie sa obtinem o instanta a acestuia. Pe un sistem pot sa existe mai multe deviceuri conectare. Odata ce obtinem o instanta a deviceului este nevoie sa initializam senzori pe care urmeaza sa ii folosim. Nu este obligatoriu sa inializam doar un singur senzor de pe device. Putem sa iniailizam oricati senzori avem nevoie.
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 ca
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:
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

Comments

  1. Faina jucarie :)

    Nu 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 )

    ReplyDelete
  2. Ai dreptate Tudor. In cazul in care se cumpara varianta pentru PC a acestui device.
    SDK-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.

    ReplyDelete

Post a Comment

Popular posts from this blog

How to check in AngularJS if a service was register or not

There are cases when you need to check in a service or a controller was register in AngularJS.
For example a valid use case is when you have the same implementation running on multiple application. In this case, you may want to intercept the HTTP provider and add a custom step there. This step don’t needs to run on all the application, only in the one where the service exist and register.
A solution for this case would be to have a flag in the configuration that specify this. In the core you would have an IF that would check the value of this flag.
Another solution is to check if a specific service was register in AngularJS or not. If the service was register that you would execute your own logic.
To check if a service was register or not in AngularJS container you need to call the ‘has’ method of ‘inhector’. It will return TRUE if the service was register.
if ($injector.has('httpInterceptorService')) { $httpProvider.interceptors.push('httpInterceptorService&#…

ADO.NET provider with invariant name 'System.Data.SqlClient' could not be loaded

Today blog post will be started with the following error when running DB tests on the CI machine:
threw exception: System.InvalidOperationException: The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer' registered in the application config file for the ADO.NET provider with invariant name 'System.Data.SqlClient' could not be loaded. Make sure that the assembly-qualified name is used and that the assembly is available to the running application. See http://go.microsoft.com/fwlink/?LinkId=260882 for more information. at System.Data.Entity.Infrastructure.DependencyResolution.ProviderServicesFactory.GetInstance(String providerTypeName, String providerInvariantName) This error happened only on the Continuous Integration machine. On the devs machines, everything has fine. The classic problem – on my machine it’s working. The CI has the following configuration:

TeamCity.NET 4.51EF 6.0.2VS2013
It seems that there …

Run native .NET application in Docker (.NET Framework 4.6.2)

Scope
The main scope of this post is to see how we can run a legacy application written in .NET Framework in Docker.

Context
First of all, let’s define what is a legacy application in our context. By a legacy application we understand an application that runs .NET Framework 3.5 or higher in a production environment where we don’t have any more the people or documentation that would help us to understand what is happening behind the scene.
In this scenarios, you might want to migrate the current solution from a standard environment to Docker. There are many advantages for such a migration, like:

Continuous DeploymentTestingIsolationSecurity at container levelVersioning ControlEnvironment Standardization
Until now, we didn’t had the possibility to run a .NET application in Docker. With .NET Core, there was support for .NET Core in Docker, but migration from a full .NET framework to .NET Core can be costly and even impossible. Not only because of lack of features, but also because once you…