Expo kinect

3,112 views
2,964 views

Published on

Published in: Business, Technology
0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,112
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
0
Comments
0
Likes
6
Embeds 0
No embeds

No notes for slide

Expo kinect

  1. 1. <Desarrollo con Kinect><br />Por: Fabián Andrés Gómez<br />
  2. 2. Introducción<br /> El periférico Kinect de Microsoft ofrece posibilidades sin precedentes para la experimentación interactiva y el desarrollo de aplicaciones de realidad aumentada (AR) con interfaces naturales de usuario (NUI). Lo particular del kinect es la conjunción de un amplio conjunto de sensores, bajo costo, preprocesamientoon-board, apoyo de la comunidad libre y un respaldo –ambiguo, debe decirse- del propio Microsoft al desarrollo por fuera de la Xbox. <br />
  3. 3. <Generalidades><br />
  4. 4. Detalles del hardware<br /> El Kinect es un dispositivo USB multicomponenteque incluye dos cámaras, una VGA (640x480) y una QVGA (320x240). La primera de estas es una cámara normal (similar a una webcam), mientras la segunda carece de filtro IR y se emplea para medir distancias a partir del proyector IR integrado. La frecuencia de actualización de ambas cámaras es de 30 fps. Adicionalmente el Kinect cuenta con un array de micrófonos (con cancelación de eco y ruido on-board). Curiosidades: 64 MB de memoria DDR2, lámina peltier tras proyector IR, acelerómetro, 12W de consumo (vs. 2.5 suministrados por un USB).<br />
  5. 5. Fuente: http://www.ifixit.com/Teardown/Microsoft-Kinect-Teardown<br />
  6. 6. Alternativas de desarrollo (1)<br /> Antes del 16 de Junio existían dos alternativas para desarrollar en Kinect:<br />OpenNI+ NITE: librería y drivers del fabricante del Kinect (PrimeSense). Soporta audio, video, profundidad, skeletal tracking y handgesturerecognition. Tiempo de instalación: 5 minutos.<br />Libfreenect: de Openkinect.org, con gran apoyo por parte de la comunidad Open Source. Soporta audio y video. Tiempo de instalación: 1 hora.<br />
  7. 7. Alternativas de desarrollo (2)<br />El 16 de Junio de 2011 Microsoft liberó el SDK beta para desarrollo de aplicaciones en Windows 7 para Kinect. Este incluye un API para desarrollo (en C#, VB y C++), y ejemplos de código. El instalador y la documentación están disponibles en la URL http://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/(más fácil: tinyurl.com/sdkkinect)<br />
  8. 8. Características SDK oficial<br />Soporta skeletal tracking de dos personas y rastreo de posición de hasta cuatro.<br />Soporta múltiples dispositivos Kinect.<br />Streams de vídeo estándar y de datos de distancia de los objetos con respecto al sensor.<br />Streams de audio del array de 4 micrófonos con identificación de fuente y soporte de reconocimiento de voz vía Microsoft.Speech.<br />Baja latencia para los streams de datos recuperados (similar a la disponible en la Xbox 360).<br />
  9. 9. Limitaciones SDK oficial<br />No permite el desarrollo comercial<br />Las aplicaciones desarrolladas deben correr sobre la máquina física y no en VMs<br />Creado para desarrollo en conjunto con herramientas de Microsoft (Visual Studio 2010 sobre Windows 7)<br />Sólo soporta desarrollo x86 (aunque se incluyen drivers x64 y x86 las librerías son para x86)<br />Los motores pueden ser activados 1 vez por segundo o máximo 15 veces en 20 segundos.<br />El skeletal tracking sólo opera con figuras en posición de pie.<br />
  10. 10. Arquitectura SDK oficial (1)<br />Fuente: “Getting Started with the Kinect for Windows SDK Beta from Microsoft Research”. P. 15. Disponible en http://http://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/ docs/ProgrammingGuide_KinectSDK.pdf (Consultado el 28 de Junio de 2011)<br />
  11. 11. Arquitectura SDK oficial (2)<br />Fuente: “Getting Started with the Kinect for Windows SDK Beta from Microsoft Research”. P. 15. Disponible en http://http://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/ docs/ProgrammingGuide_KinectSDK.pdf (Consultado el 28 de Junio de 2011)<br />
  12. 12. Archivos del API<br />
  13. 13. <Desarrollo con el SDK><br />
  14. 14. La demo desarrollada consiste en un Arkanoid o Breakout simplificado. La interacción del usuario se realiza a partir de skeletal tracking e interpretación de gestos basada en el sensor de imagen de video. Está implementada en C# con WPF (Windows PresentationFoundation) para la interfaz. <br />
  15. 15. Uso del SDK (preliminares)<br />Se debe adicionar como referencia del proyecto en Visual Studio la dll que contiene el namespaceMicrosoft.Research.Kinect.Nui (el archivo en cuestión es homónimo y está en el directorio del SDK). Adicionalmente se debe declarar el uso del namespace asociado en la clase de la ventana principal.<br />
  16. 16. Uso del SDK (inicialización)<br />Todo programa desarrollado en Kinect debe iniciar creando un objeto Runtime, el cual representa al dispositivo Kinect y todos sus recursos disponibles. Se le pasa como parámetro un OR con los sensores y configuraciones de los mismos que se van a emplear:<br />Esto tiene lugar en el método que maneja el evento de carga de la ventana (Window_loaded)<br />Runtime kinect = new Runtime();<br />kinect.initialize(RuntimeOptions.UseSkeletalTracking | RuntimeOptions.UseColor)<br />
  17. 17. Uso del SDK (inicialización)<br />Al finalizar el uso de los sensores se debe “apagar” el uso de los servicios del kinect:<br />kinect.Shutdown();<br />
  18. 18. Uso del SDK (flujos de datos)<br />Como parte del mismo método llamado al cargar la ventana se abren los flujos de los sensores:<br />Kinect generará eventos de esqueleto y cuadros de video, por lo que deben registrarse métodos para manejarlos:<br />kinect.VideoStream.Open(ImageStreamType.Video, 2, ImageResolution.Resolution640x480, ImageType.Color); kinect.DepthStream.Open(ImageStreamType.Depth, 2, ImageResolution.Resolution320x240, ImageType.DepthAndPlayerIndex);<br />kinect.SkeletonFrameReady += new EventHandler<SkeletonFrameReadyEventArgs>(SkeletonFrameReady);<br />kinect.VideoFrameReady += new EventHandler<ImageFrameReadyEventArgs>(ColorFrameReady);<br />
  19. 19. Uso del SDK (flujos de datos)<br />Como alternativa a esta aproximación (de tipo PUSH o suscripción) puede hacerse PULL de las actualizaciones con ImageStream.GetNextFrameoSkeletonEngine.GetNextFrame. En este caso la lógica de la aplicación debe controlar el ritmo al que se solicitan los datos de acuerdo a la configuración elegida para el sensor (los API de imagen y datos de distancias nunca entregan el mismo frame dos veces).<br />
  20. 20. Uso del SDK (captura video)<br />En el caso de la fuente de video se recuperará un objeto PlanarImage que representa la imagen con una profundidad de color de 32 bits. WPF integra el método BitmapSource.Create que convierte los bits en bruto recibidos en un bmp:<br />void ColorFrameReady(object sender, ImageFrameReadyEventArgs e)<br /> {<br />PlanarImage Image = e.ImageFrame.Image;<br />ideo.Source = BitmapSource.Create(<br />Image.Width, Image.Height, 96, 96, PixelFormats.Bgr32, null, Image.Bits, Image.Width * Image.BytesPerPixel);<br />}<br />
  21. 21. Uso del SDK (skeletal tracking)<br />Ahora bien en cuanto al skeletal tracking este puede ser activo (2 jugadores) o pasivo (4 jugadores). Las 20 articulaciones (representadas por objetos Joint), requieren una triple conversión de coordenadas para trazar un esqueleto en pantalla.<br />
  22. 22. Uso del SDK (conversiones)<br />La conversión de coordenadas (para articulaciones y huesos) tiene lugar así:<br />private Point getDisplayPosition(Jointjoint)<br /> {<br />floatdepthX, depthY;<br />kinect.SkeletonEngine.SkeletonToDepthImage(joint.Position, outdepthX, outdepthY);<br />depthX = Math.Max(0, Math.Min(depthX * 320, 320)); <br />depthY = Math.Max(0, Math.Min(depthY * 240, 240)); <br />intcolorX, colorY;<br />ImageViewAreaiv = new ImageViewArea();<br />kinect.NuiCamera.GetColorPixelCoordinatesFromDepthPixel( ImageResolution.Resolution640x480, iv, (int)depthX,(int)depthY, (short)0, outcolorX, outcolorY);<br /> return new Point((int)(skeleton.Width * colorX / 640.0), (int)(skeleton.Height * colorY / 480));<br /> }<br />
  23. 23. Uso del SDK (salida gráfica)<br />A la conversión referida deben recurrir el método que hace el manejo de los eventos del esqueleto, pues este se ocupa de dibujar articulaciones y huesos. Para ello inicia recuperando del frame recibido un arreglo de datos de esqueletos capturados… <br />voidnui_SkeletonFrameReady(objectsender, SkeletonFrameReadyEventArgs e)<br /> {<br />SkeletonFrameskeletonFrame = e.SkeletonFrame;<br />intiSkeleton = 0;<br />Brush[] brushes = new Brush[6];<br />brushes[0] = new SolidColorBrush(Color.FromRgb(255, 0, 0));<br /> //Omitida definición de los otros 5 pinceles...<br />SkeletonData[] skeletonArray = skeletonFrame.Skeletons; <br />skeleton.Children.Clear();<br />…<br />
  24. 24. Uso del SDK (manejo esqueleto)<br />…y hace un recorrido doble sobre este arreglo para dibujar huesos y articulaciones:<br />foreach (SkeletonData data in skeletonFrame.Skeletons)<br /> {<br />if (SkeletonTrackingState.Tracked == data.TrackingState)<br /> {<br />Brushbrush = brushes[iSkeleton % brushes.Length];<br />skeleton.Children.Add(getBodySegment(data.Joints, brush, JointID.HipCenter, JointID.Spine, JointID.ShoulderCenter, JointID.Head));<br />//Omitida adición a Children de los 4 segmentos de cuerpo restantes<br />foreach (Jointjoint in data.Joints)<br /> {<br /> Point jointPos = getDisplayPosition(joint);<br /> Line jointLine = new Line();<br /> //Omitida ampliación de la dimensión de la art.<br />skeleton.Children.Add(jointLine);<br /> }<br /> }<br />…<br />
  25. 25. Uso del SDK (gestos)<br />Dado que el SDK no ofrece soporte de gestos estos deben ser interpretados en el código de las aplicaciones. Para lograr esto se emplean los siguientes recursos:<br /><ul><li>Extensiones a los métodos del SDK (Coding4Fun KineticToolkit, disponible en http://c4fkinect.codeplex.com/). Incluye métodos para escalar la posición de una articulación con respecto a la resolución de la pantalla (ScaleTo).
  26. 26. Emulación de eventos de mouse mediante el API de Windows (user32.dll). Una clase helper (MouseHelper) traduce el input generado por las articulaciones en los argumentos que acepta SendInput de dicho API. </li></li></ul><li>Uso de SDK (gestos)<br />Si se desea emplear las articulaciones de las manos como base para los gestos lo primero que se debe hacer es verificar que estas estén siendo rastreadas…<br />booltracked = data.Joints[JointID.HandLeft].TrackingState== JointTrackingState.Tracked &&<br />data.Joints[JointID.HandRight].TrackingState == JointTrackingState.Tracked<br />if (tracked)<br /> {<br />…<br />
  27. 27. Uso del SDK (gestos)<br />…y tras escalar a las dimensiones de la pantalla las coordenadas de las manos… <br />…<br />intcursorX, cursorY;<br />JointjointRight = data.Joints[JointID.HandRight];<br />JointjointLeft = data.Joints[JointID.HandLeft];<br />JointscaledRight = jointRight.ScaleTo((int)SystemParameters.PrimaryScreenWidth, (int)SystemParameters.PrimaryScreenHeight, SkeletonMaxX, SkeletonMaxY);<br />JointscaledLeft = jointLeft.ScaleTo((int)SystemParameters.PrimaryScreenWidth, (int)SystemParameters.PrimaryScreenHeight, SkeletonMaxX, SkeletonMaxY);<br />cursorX = (int)scaledRight.Position.X;<br />cursorY = (int)scaledRight.Position.Y;<br />…<br />
  28. 28. Uso del SDK (gestos)<br />…se pueden remitir los datos al método de MouseHelper encargado de la emulación del mouse:<br />…<br />boolleftClick;<br />if (jointLeft.Position.Y > ClickThreshold)<br />leftClick = true;<br />else<br />leftClick = false;<br />MouseHelper.SendMouseInput(cursorX, cursorY, (int)SystemParameters.PrimaryScreenWidth, (int)SystemParameters.PrimaryScreenHeight, leftClick);<br /> }<br />
  29. 29. Si bien el SDK de Kinect exige más al programador que OpenNI+ NITE al no contar con reconocimiento de gestos, al tratarse del SDK oficial cuenta con soporte pleno de Microsoft (y es probable que se imponga frente a sus alternativas). Se recomienda no obstante probar OpenNI+ NITE, pues con más de 6 meses de desarrollos en Kinectofreceuna base sólida a quien se iniciaen estaslides.<br />
  30. 30. Referencias<br />“Getting started with Microsoft KinectSDK”. Disponible en http://www.i-programmer.info/programming/hardware/2623-getting-started-with-microsoft-kinect-sdk [Consultado el 28 de Julio de 2011]<br />“Programming Guide: Getting Started with the Kinect for Windows SDK Beta”. Incluido en la documentación del SDK.<br />“SkeletalViewerWalkthrough”. Disponible en http://research.microsoft.com/ en-us/um/redmond/projects/kinectsdk/guides.aspx [Consultado el 29 de Julio de 2011]<br />

×