Windows Mobile Support

  • Subscribe to our RSS feed.
  • Twitter
  • StumbleUpon
  • Reddit
  • Facebook
  • Digg

Monday, 13 February 2012

Kinect SDK preview

Posted on 12:23 by Unknown
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
Email ThisBlogThis!Share to XShare to FacebookShare to Pinterest
Posted in Kinect SDK | No comments
Newer Post Older Post Home

0 comments:

Post a Comment

Subscribe to: Post Comments (Atom)

Popular Posts

  • Service Bus Topic - Automatic forward messages from a subscription to a topic
    Windows Azure Service Bus Topic is a service that enables us to distribute the same messages to different consumers without having to know e...
  • CDN is not the only solution to improve the page speed - Reverse Caching Proxy
    I heard more and more often think like this: “If your website is to slow, you should use a CDN.” Great, CDN is THE solution for any kind of ...
  • Content Types - Level 6: Rich Media
    Level 6: Rich Media NOTE: This is part 7 of 7 and the conclusion of this continuing series; please see earlier posts for more background inf...
  • Patterns in Windows Azure Service Bus - Message Splitter Pattern
    In one of my post about Service Bus Topics from Windows Azure I told you that I will write about a post that describe how we can design an a...
  • E-Learning Vendors Attempt to Morph Mobile
    The sign should read: " Don't touch! Wet Paint !" I had a good chuckle today after receiving my latest emailed copy of the eLe...
  • SQL - UNION and UNION ALL
    I think that all of us used until now UNION in a SQLstatement. Using this operator we can combine the result of 2 queries. For example we wa...
  • Publishing our CellCast Widget for iPad
    The rush has been on this week as our development team worked to design a new version of our CellCast Widget specifically for Apple's up...
  • Content Types - Level 2: SMS Campaigns
    Level 2: Interactive Messaging NOTE: This is part 3 of 7 in a continuing series; please see earlier posts for more background information. L...
  • Cum sa salvezi un stream direct intr-un fisier
    Cred ca este a 2-a oara când întâlnesc aceasta cerința in decurs de câteva săptămâni. Se da un stream și o locație unde trebuie salvat, se c...
  • Content Types - Level 4: Reference
    Level 4: Reference Materials & Static Content NOTE: This is part 5 of 7 in a continuing series; please see earlier posts for more backgr...

Categories

  • .NET
  • .NET nice to have
  • #if DEBUG
  • 15 iunie 2011
  • 15 octombrie 2011
  • 2011
  • abstracta
  • action
  • adaugare
  • ajax
  • Amsterdam
  • Android
  • aplicatii
  • App Fabric
  • Apple iSlate
  • array
  • as
  • ASP.NET
  • AsReadOnly
  • Assembly comun
  • async
  • Asynchronous programming
  • asyncron
  • Autofac
  • AutoMapper
  • az
  • Azure
  • Azure AppFabric Cache
  • Azure backup solution
  • Azure Storage Explorer
  • azure. cloud
  • backup
  • BCP utility
  • bing maps v7
  • BitArray
  • BlackBerry
  • blob
  • BlobContainerPublicAccessType
  • breakpoint
  • bucuresti
  • C#
  • cache
  • CallerMemberName
  • CellCast
  • Certificate
  • CES
  • change
  • ChannelFactory
  • clasa
  • classinitialize
  • clean code
  • click event
  • close
  • Cloud
  • Cluj
  • cluj-napoca
  • Code contracts
  • code retrat
  • codecamp
  • CollectionAssert
  • Compact Edition
  • compara
  • Comparer T .Default
  • CompareTo
  • comparison
  • comunitate
  • concurs
  • Conditional attribute
  • configurare
  • connection string
  • container
  • content type
  • control
  • Convert
  • convertAll
  • convertor
  • cross platform
  • CRUD
  • css
  • custom properties
  • custom request
  • DACPAC
  • Daniel Andres
  • data sync service
  • database
  • date time
  • datetime
  • debug
  • default
  • delegate
  • dependency injection
  • deploy
  • DeploymentItem
  • design patterns
  • Dev de Amsterdam
  • development stoage
  • dictionary
  • diferente
  • digging
  • director
  • Directory.Exist
  • disable
  • dispatcher
  • dispose
  • dropdown
  • dynamic
  • EF
  • email
  • encoding
  • entity framework
  • enum
  • enumerable
  • Environment.NewLine
  • error
  • error 404
  • error handling
  • eveniment
  • event
  • ews
  • excel
  • exception
  • exchange
  • exita
  • explicit
  • export
  • extension
  • field
  • File.Exist
  • finalize
  • fire and forget
  • Fluent interface pattern
  • format
  • func
  • GC.SuppressFinalize
  • generic
  • getdirectoryname
  • globalization
  • gmail
  • hackathon
  • Hadoop
  • handle
  • HTML
  • html 5
  • Html.ActionLink
  • http://www.blogger.com/img/blank.gif
  • HttpModule
  • IComparable
  • IE
  • ienumerable
  • IIS
  • image
  • implicit
  • import
  • int
  • internationalization
  • Internet Explorer
  • interop
  • Ioc
  • IP Filter
  • iPhone
  • iQuest
  • IStructuralEquatable
  • ITCamp
  • itspark
  • java script
  • javascript
  • July 2012
  • KeyedByTypeCollection
  • KeyNotFoundException
  • Kinect SDK
  • lambda expression
  • LightSwitch Microsoft Silverlight
  • linq
  • list
  • lista
  • lista servicii
  • liste
  • Live Connect
  • Live ID
  • load
  • localization
  • lock
  • m-learning
  • MAC
  • Mango
  • map
  • mapare
  • mapare propietati
  • messagequeue
  • meta properties
  • method
  • MethodImpl
  • Metro App
  • Microsoft
  • Microsoft Sync Framework
  • mlearning
  • mlearning devices
  • Mobile Apps
  • mobile in the cloud
  • mobile learning
  • mobile services
  • Mobile Web
  • mongoDb
  • monitorizare
  • msmq
  • multitasking
  • MVC
  • MVC 3
  • MVVM
  • namespace
  • nextpartitionkey
  • nextrowkey
  • Ninject
  • nivel acces
  • no result
  • normalize
  • nosql
  • null expcetion
  • null object pattern
  • NullReferenceException
  • OAuth API
  • office
  • offline
  • Open ID
  • openhackeu2011
  • operations
  • operator
  • optimization
  • option
  • outputcache
  • OutputCacheProvider
  • override
  • paginare
  • pagination
  • path
  • persistare
  • Portable Library tool
  • Post event – CodeCamp Cluj-Napoca
  • predicate
  • predictions
  • prezentare
  • process
  • proiect
  • property
  • propietati
  • query
  • ReadOnlyCollection
  • ReadOnlyDictionary
  • referinta
  • reflection
  • remote
  • reply command
  • request
  • request response
  • resouce
  • REST
  • REST Client
  • RESTSharp
  • ronua
  • rss
  • rulare
  • salvare in fisier
  • sc
  • schimbare timp
  • select
  • select nodes
  • send
  • serializare
  • serialization
  • Server.Transfer. Resposen.Redirect
  • service bus
  • ServiceBase
  • servicecontroller
  • sesiune
  • session
  • Session_End
  • Session_Start
  • setup
  • Sibiu
  • signalR
  • Silverlight
  • sincronizare
  • Single Responsibility Principle
  • SkyDrive
  • skype
  • smartphones
  • smtp
  • Snapguide
  • sniffer
  • socket
  • solid
  • spec#
  • sql
  • Sql Azure
  • SQL CE
  • sql server 2008 RC
  • SRP
  • startuptype
  • stateful
  • stateless
  • static
  • stergere
  • store
  • store procedure
  • stream
  • string
  • string.join
  • struct
  • StructuralEqualityComparer
  • submit
  • switch
  • Symbian
  • Synchronized
  • system
  • tabele
  • table
  • techEd 2012
  • tempdata
  • test
  • testcleanup
  • testinitialize
  • testmethod
  • thread
  • timer
  • ToLower
  • tool
  • tostring
  • Total Cost Calculator
  • trace ASP.NET
  • transcoding
  • tuplu
  • tutorial
  • TWmLearning
  • type
  • unit test
  • unittest
  • UrlParameter.Optional
  • Validate
  • validation
  • verificare
  • video
  • view
  • ViewBag
  • virtual
  • visual studio
  • VM role
  • Vunvulea Radu
  • wallpaper
  • WCF
  • WebBrower
  • WebRequest
  • where clause
  • Windows
  • windows 8
  • Windows Azure
  • Windows Azure Service Management CmdLets
  • windows live messenger
  • Windows Mobile
  • Windows Phone
  • windows service
  • windows store application
  • Windows Task
  • WinRT
  • word
  • workaround
  • XBox
  • xml
  • xmlns
  • XNA
  • xpath
  • YMesseger
  • Yonder
  • Zip

Blog Archive

  • ►  2013 (139)
    • ►  November (17)
    • ►  October (12)
    • ►  September (10)
    • ►  August (7)
    • ►  July (8)
    • ►  June (15)
    • ►  May (12)
    • ►  April (17)
    • ►  March (16)
    • ►  February (9)
    • ►  January (16)
  • ▼  2012 (251)
    • ►  December (9)
    • ►  November (19)
    • ►  October (26)
    • ►  September (13)
    • ►  August (35)
    • ►  July (28)
    • ►  June (27)
    • ►  May (24)
    • ►  April (18)
    • ►  March (17)
    • ▼  February (20)
      • How NOT to use AS keyword
      • Default value and TryParse
      • Field like events and polymorphic invocation
      • The string representation of a bool
      • WCF and Silverlight - How to add custom informat...
      • Windows Live - SkyDrive
      • WCF - How to add custom information to a message h...
      • Post Event - CodeCamp la Cluj-Napoca, 18 feb. 2012
      • Debug Silverlight application - breakpoint not hit
      • DateTime.ToString() formats
      • Kinect SDK preview
      • MVC - What a view should never contain( part 2)
      • MVC - What a view should never contain( part 1)
      • Interop - release COM objects( Excel.EXE hanging)
      • Intâlnire CodeCamp la Cluj-Napoca - 18 feb. 2012
      • How to change Windows wallpaper from .NET
      • How to display simple math formulas using .NET
      • Short brief - Request-Response, Asynchron and Fire...
      • Windows Live - Basic operations
      • CRUD operation on Windows Task from .NET
    • ►  January (15)
  • ►  2011 (127)
    • ►  December (11)
    • ►  November (20)
    • ►  October (8)
    • ►  September (8)
    • ►  August (8)
    • ►  July (10)
    • ►  June (5)
    • ►  May (8)
    • ►  April (9)
    • ►  March (14)
    • ►  February (20)
    • ►  January (6)
  • ►  2010 (26)
    • ►  December (1)
    • ►  November (1)
    • ►  October (1)
    • ►  June (2)
    • ►  May (1)
    • ►  April (4)
    • ►  March (1)
    • ►  February (1)
    • ►  January (14)
Powered by Blogger.

About Me

Unknown
View my complete profile