sábado, 5 de julio de 2014

Herramientas a utilizar, problemáticas. Parte 2

Continuando con la entrada anterior del blog donde se describía que unos de los pilares para llevar a cabo este proyecto era necesario implementar la funcion drag and drop con la kinect, para mover las piezas del puzzle en la aplicación. Dado que la alternativa de usar una demo que implementara mousekinect, quedo fuera por factibilidad técnica de no tener la kinect for windows.
Entonces buscando algún código fuente o demo que implementara la función drag and drop directamente con kinect, encontré el siguiente demo para dar curso a este proyecto:
https://github.com/tkowalczyk/KinectDragDrop //es necesario tener kinect sdk 1.8.

En pocas palabras este demo implementa la función de arrastrar y mover algo en pantalla como una imagen y hacer algo al respecto, en concreto se puede mover una imagen a otro lado de la pantalla usando la mano("se puede llevar un circulo de color azul a un rectángulo del mismo color, se reconoce la acción correspondiente de poner los círculos en los rectángulos del mismo color de la figura").


Ya con este demo se procedió a desarrollar el proyecto, en la siguiente entrada iré explicando las actividades necesarias para adaptar este demo y desarrollar el puzzle con kinect.



domingo, 15 de junio de 2014

Herramientas a utilizar, problemáticas. Parte 1

Para realizar el proyecto de kinect puzzle, dadas las herramientas existentes y código fuente disponible en la red opte por usar alguna demo en la red que permitiera el uso del mouse con kinect, ya que el uso de arrastre de piezas o imagenes ("drag and drop") en el desarrollo de una aplicación WPF es bastante sencillo.
Acá una simple implementacion de un puzzle en WPF.


El movimiento de piezas de la lista a los casilleros, se hace solo mediante el uso del mouse.
Si se quiere saber mas en detalle sobre esta demo. seguir este enlace: http://www.codeproject.com/Articles/92858/WPF-Simple-Puzzle

Entonces parecía interesante integrar esta demo con algo que implementara el uso del mouse con kinect. Y conseguir una aplicación mas acabada e interactiva.
Por lo cual procedí a buscar y ejecutar demos que implementaran el uso del mouse con kinect. La primera dificultad con la cual me encontré, de las varias implementaciones que encontré estaban implementadas con diferentes versiones de kinect sdk ("1.2 a 1.8"), después de varios intentos para ejecutar alguna de ellas tuve que desintalar kinect sdk 1.8 y instalar una versión mas antigua como kinect sdk 1.2 con el resultado de poder ejecutar esta demo (http://www.getcodesamples.com/src/AB4DA0A9) sin problemas. Pero surgió el siguiente problema, de todas las demos que implementaban el uso del mouse con kinect estaban desarrolladas para usarlas con kinect for windows y no con kinect for xbox360, lo que repercutió que no podía con mi kinect for xbox360 utilizar todas las funciones del mouse y por lo tanto no poder hacer drag and drop, que es lo fundamental para llevar acabo este proyecto.

En la siguiente entrada explicare cual fue el siguiente paso, para llevar a cabo el proyecto con otra alternativa.










Nuevo enfoque , Otro Proyecto

En esta entrada voy a dejar el anteproyecto o descripción de mi nuevo proyecto con Kinect. La razón por la cual me embarco en u nuevo proyecto es por motivos de factibilidad técnica y cambio de grupo de trabajo.

DESCRIPCIÓN DEL PROYECTO (experiencia interactiva)

El proyecto corresponde a desarrollar una aplicación utilizando el controlador de videojuegos Kinect.

La aplicación consistirá en un puzzle interactivo, mediante una aplicación de escritorio y kinect. La aplicación tendrá una pantalla principal desde la cual tendremos 2 paneles, en uno estarán las piezas que componen el puzzle o imagen y en el otro panel donde deberemos arrastrar las piezas a hacia el y ir ordenándolas, el arrastre de piezas sera utilizando nuestra mano ("esto se logra mediante la integración del dispositivo kinect").

Justificación del enfoque del proyecto:

Se escoge como temática de aplicación “un Puzzle”, orientando para niños pequeños por los beneficios (*) que con lleva esto y lo novedoso de usar el dispositivo Kinect.

Beneficios (*) de armar puzzles en preescolares
El niño desarrolla su capacidad de aprender, entender y organizar las formas espaciales.
Práctica la observación, descripción y comparación; elementos necesarios para encontrar diferentes aspectos de cada pieza (color, forma, bordes, cortes, tamaño, etc.), así como detalles similares a otras y así poder reconstruir poco a poco el todo.
Desarrolla la capacidad de resolver problemas.
Ejercita su memoria visual.

ALCANCE

Aplicación interactiva con kinect sdk, para armar puzzles mediante el dispositivo Kinect.

El juego en su primera etapa corresponderá a imágenes predefinidas para el puzzle.

Se trabajará con el dispositivo kinect for xbox 360.

El tipo de puzzles serán hasta 15 piezas (“aún por definir”) orientado a preescolares.

RESTRICCIONES

El juego no tendrá estadísticas de los jugadores y su uso será de un solo jugador.

El juego o aplicación será monousuario.

El juego o aplicación solo podrá ser usado con un PC o notebook, no con la consola Xbox 360.

Durante las siguientes semanas iré exponiendo como se va desarrollando este mini proyecto.


domingo, 18 de mayo de 2014

Detectando esqueletos 3D Kinect.

Siguiendo con el Hilo del blog, en esta oportunidad hablare sobre lo elementos que se deben conocer para trabajar con los esqueletos creados por el sdk de kinect. Aquí va una imagen para que se den cuenta de lo que estamos hablando:





















Este esqueleto creado por el sdk kinect vendría a representar la captura de nuestro cuerpo y el método del sdk que proporciona este flujo de datos es SkeletonStream.Enable(); . El sdk de kinect detecta 20 articulaciones del cuerpo humano que aparecen etiquetadas en la imagen de arriba.
Ahora a lo mas practico, como capturamos estos datos:



Describiré los pasos mas importante que a cuanto codigo se deben entender bien:

Para el paso 1) debemos escribir en nuestro código SkeletonStream.Enable(); 

Para el paso 2) necesitaremos en nuestro código utilizar un event.handler para este caso
 e.OpenSkeletonFrame()

.. Previo al paso 3 y 4, en nuestro código necesitamos declarar esta variable:
  Skeleton[] esqueletos = null;

Para el paso 3)  esqueletos = new Skeleton[frameEsqueleto.SkeletonArrayLength];

Para el paso 4) .CopySkeletonDataTo(esqueletos);

Para el Paso 5)  foreach (Skeleton esqueleto in esqueletos) ..

Para el Paso 6) if (esqueleto.TrackingState == SkeletonTrackingState.Tracked) con esta sentencia estamos verificando si se detecta nuestro esqueleto o no.

Para el Paso 8) en nuestro código por ejemplo  JointType.HandRight, estaríamos eligiendo nuestra mano derecha ("la articulación").

Para representar este esqueleto del sdk, podemos usar canvas para ir uniendo cada articulación en este caso las 20 articulaciones, entonces sabiendo la posición o coordenadas de cada una ellas podemos ir dibujando y uniendo con lineas para formar el esqueleto y tener una representación por pantalla en nuestra aplicación de lo que esta capturando la kinect..












domingo, 27 de abril de 2014

Proyecto con kinect // motricidad gruesa con niños.

Ya con haber hecho una pequeña introducción de kinect sdk, iré desarrollando los conceptos de kinect sdk para llevar a cabo este proyecto. En esta oportunidad hablaremos del sensor de profundidad de kinect y lo que podemos hacer con el de forma individual.



Como se puede ver hay 2 sensores que tiene que ver con la profundidad, uno es el infrarrojo que emite puntos infrarrojos (izquierda de la imagen) y el otro ("o cámara infrarroja") a la derecha es el que captura estos puntos infrarrojos que emite el otro sensor de la izquierda.
Ahora como trabajamos con estos puntos

Cuando inicializamos el envió de datos de profundidad 

miKinect.DepthStream.Enable();
, este nos enviara una gran cantidad de distancias (En imagen, el primer recuadro representa estas distancias enviadas) , pero estas distancias no son del mismo tamaño como los pixeles de color , estos requieren ser almacenados en un array de tipo short[](" porque con este tipo de datos podemos almacenar datos de 16 bits"). Viendo la imagen nos podemos dar cuenta que hay 3 cuadros de color amarillo (3 bits), estos corresponden a los datos de los esqueletos que para esta oportunidad no trabajaremos con ellos y que para el caso practico cuando almacenemos estas distancias:

int valorDistancia = datosDistancia[i] >> 3; // la parte que queda en rojo, quita los 3 últimos bits del arreglo que no ocuparemos.
//datosDistancia[i], sera nuestro arreglo de tipo short!

Desde esta forma podemos ir controlando estos datos, como por ejemplo desde nuestro código con un eventhandler para capturar este flujo de información

for (int i = 0; i < framesDistancia.PixelDataLength; i++ )
{
int valorDistancia = datosDistancia[i] >> 3;

} //Aquí almacenamos cada distancia del arreglo short!.

y luego con estos podemos usar el método DepthStream.UnknownDepth para comparar si nuestra kinect esta detectando una distancia desconocida e emitir un color en un aplicación por ventana.

if (valorDistancia == miKinect.DepthStream.UnknownDepth)
{

colorImagenDistancia[posColorImagenDistancia++] = 0; //Azul
colorImagenDistancia[posColorImagenDistancia++] = 0; //Verde
..

En la semana subiré un código completo documentado para ejecutar un ejemplo con lo que explicado en este post.








domingo, 20 de abril de 2014

Primera Aplicacion sencilla con Kinect en Visual Studio 2013

Teniendo ya todo listo de lo descrito en el post anterior procederemos a crear una aplicación sencilla que hace uso de la camara RGB de Kinect.

  1. Primero debemos crear un proyecto de tipo aplicación WPF.
  2. Para poder operar con la librería de kinect, debemos agregar la referencia Microsoft.Kinect
  3. Habiendo agregado la referencia, debemos agregar el namespace en el código fuente using Microsoft.Kinect;
  4. Ahora debemos agregar un control image, lo expandimos sobre toda la ventana.
  5. Ya con el control image listo, debemos agregar un evento a la ventana. Desde propiedades buscamos el evento loaded y clic!
Ahora completando el codigo iré documentando que significa cada cosa.

using Microsoft.Kinect;
namespace CamaraWebSencilla
{
    /// <summary>
    /// Lógica de interacción para MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        KinectSensor miKinect;
        public MainWindow()
        {
            InitializeComponent();
        }
        private void Window_Loaded(object sender, RoutedEventArgs e) //nuestro método paso 5
        {
            miKinect = KinectSensor.KinectSensors.FirstOrDefault(); // Almacenamos nuestra kinect en esta variable para así llamar sus funciones. //
            miKinect.Start(); // Aca le indicamos que inicio.
            miKinect.ColorStream.Enable(); //Este método da inicio a la señal de flujo de stream de la cámara (Habilita la cámara).
            miKinect.ColorFrameReady += miKinect_ColorFrameReady; //Con este controlador de eventos le decimos a la aplicación que debe hacer cuando detecte el flujo de datos.
        }
        void miKinect_ColorFrameReady(object sender, ColorImageFrameReadyEventArgs e)
        {
            using (ColorImageFrame frameImagen = e.OpenColorImageFrame())
            {
                if (frameImagen == null)
                   return;
                byte[] datosColor = new byte[frameImagen.PixelDataLength];
                frameImagen.CopyPixelDataTo(datosColor);
                mostrarVideo.Source = BitmapSource.Create(
                    frameImagen.Width, frameImagen.Height,
                    96,
                    96,
                    PixelFormats.Bgr32,
                    null,
                    datosColor,
                    frameImagen.Width * frameImagen.BytesPerPixel
                    );
            }
        }
    }
}
Ejecutando nuestro proyecto, podremos tener una cámara web sencilla con kinect.


domingo, 13 de abril de 2014

Kinect SDK

Comienzo esta primera entrada comentando de lo que se tratara este blog y los primeros pasos que se darán para el proyecto interactivo multimedia que comenzare con un grupo de compañeros de universidad, Este blog va a ser un tipo de bitácora donde van a ir quedando avances, registros sobre el proyecto. Hemos escogido como herramienta de desarrollo Kinect SDK.
El Primer paso, hacer funcionar la Kinect!
A continuación iré detallando como empezar a programar algo sencillo en el entorno Visual Studio 2013 (express) utilizando Kinect SDK para poder hacerla funcionar, lo primero que necesitaremos es:

Sistema operativo:

Funciona en Windows 7 o superior, tanto x86 como x64

Hardware:


  • El sensor de Kinect para Xbox360

  • Ordenador con doble núcleo, 2.66GHz o superior
  • Tarjeta gráfica que soporte Microsoft DirectX® 9.0c
  • 2 GB de RAM, 4 GB recomendada

Software:

  • Microsoft Visual Studio 2010 o superior ("en todas sus versiones").
  • Windows Software Development Kit for Windows 8
  • Microsoft .NET Framework 4.0

Obtener e instalar el SDK de Kinect

Ir a la página de descarga del SDK de Kinect para Windows SDK, hacer clic 
Latest Kinect for Windows SDK
Latest Kinect for Windows Developer Toolkit

Para empezar la instalación inmediatamente, clic en Ejecutar.

Para guardar en tu ordenador para instalarlo más adelante, clic en Guardar.
Sigue el asistente para completar la instalación

Conectar el sensor Kinect al PC ("instrucciones directas del sitio web oficial MS").

Una vez descargado e instalado el SDK el siguiente paso es conectar el dispositivo al ordenador. El sensor Kinect se conecta a través del puerto USB pero tiene un firmware algo diferente que el estándar de los dispositivos USB. 
Para cargar el driver de PCKinect:

  1. Conecte la fuente de alimentación del sensor Kinect a la red eléctrica.
  2. Conecte Kinect en un puerto USB libre del PC y espere a que se reconozcan los componentes del sensor.
  3. Todos los drivers, incluidos los de audio, serán cargados sin problemas.
  4. Verificar la correcta instalación:

Debes ver parpadear el LED verde en el sensor de Kinect
En el administrador de dispositivos del panel de control, debajo de Microsoft Kinect deben aparecer los siguientes nodos:
  • Microsoft Kinect Audio Array Control
  • Microsoft Kinect Camera
  • Microsoft Kinect Device

Primera aplicación sencilla en Visual Studio 2013 .. Lo veremos la próxima semana!