Tutorial KINECT camaras RGB y de profundidad (DEPTH)

Hola
Empezaremos por lo básico, en Visual Studio 2010 creamos un nuevo proyecto WPF y en mi caso le llamare KinectPruebaCamaras.

Ahora bien una vez creado el proyecto con sus archivos iniciales nos vamos a agregar la referencia para trabajar con nuestra KINECT

Ok hasta este punto ahora vamos a nuestro código XAML de nuestra aplicación e insertamos dos controles de imagen dentro del Grid inicial donde la primera le llamaremos VideoImage y a la otra DepthImage

Bien ahora vamos a lo que en realidad tenemos que hacer, nos vamos al code behind de nuestro archivo MainPage.xaml y empezamos por lo siguiente agregando la Referencia con el siguiente código.

using Microsoft.Kinect;

ahora declaramos una variable de tipo KinectSensor que yo llamare sensor y dos variables una de tipo byte que llamare pixeldata y otra de tipo short que llamare pixel.

KinectSensor sensor = KinectSensor.KinectSensors[0];
byte[] pixelData;
short[] pixel;

Ahora debemos de habilitar las camaras con estas dos rutinas, uno para la cámara de RGB y la otra para la cámara de profundidad (DEPTH),  debemos de indicar al Kinect que vamos a utilizar en este caso las dos camaras antes mencionadas.

public partial class MainWindow : Window
{
      KinectSensor sensor = KinectSensor.KinectSensors[0];
      byte[] pixelData;
      short[] pixel;

      public MainWindow()
      {
             InitializeComponent();
             sensor.ColorStream.Enable();
             sensor.DepthStream.Enable();
          
      }
}

“Vamos bien ahí”… bueno ahora necesitamos indicar tanto iniciar el KINECT al correr la aplicación y cuando cerremos la aplicación con estas dos sencillas rutinas Start() y Stop()… (“sencillo no!?”) y en la sección del método Window_Loaded vamos a crear dos eventos ruteados dentro de la variable sensor que yo llame que contiene toda la información del dispositivo que son ColorFrameReady y DepthFrameReady.

private void Window_Loaded(object sender, RoutedEventArgs e)
{
   sensor.ColorFrameReady += new EventHandler<ColorImageFrameReadyEventArgs>(sensor_ColorFrameReady);
   sensor.DepthFrameReady += new EventHandler<DepthImageFrameReadyEventArgs>(sensor_DepthFrameReady);

   sensor.Start();
}

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
   sensor.Stop();
}

Bien ya creamos los objetos, tenemos las librerías de Kinect, inicializamos y cerramos nuestro dispositivo ahora bien falta capturar lo que nos llega de las dos camaras y guardarlas en una variable y mostrarlas en nuestra aplicación para poder empezar a trabajar en nuestro KINECT ahora vamos al método sensor_ColorFrameReady y colocamos el siguiente código.

void sensor_ColorFrameReady(object sender, ColorImageFrameReadyEventArgs e)
{
  bool receivedData = false;

  using (ColorImageFrame CFrame = e.OpenColorImageFrame())
  {
     if (CFrame == null)
     {
     }
     else
     {
     pixelData = new byte[CFrame.PixelDataLength];
     CFrame.CopyPixelDataTo(pixelData);
     receivedData = true;
     }
   }

   if (receivedData)
   {
     BitmapSource source = BitmapSource.Create(640, 480, 96, 96,
     PixelFormats.Bgr32, null, pixelData, 640 * 4);

     VideoImage.Source = source;
   }
      
 }

En el código que acabo de colocar creamos una variable de tipo boleana para detectar mediante una condición para capturar lo que nos arroja la cámara copiando los datos de lo que nos contiene CFrame y después volvemos a preguntar por nuestra variable boleana y de ser verdadero procede a crear un BitmapSource en el cual abrimos dándole los parámetros que demuestro en el código, detenerme a explicar los parámetros no son necesarios por ahora para este tutorial rapido pero en mi primer tutorial son los mismos parámetros que describi y explique, la novedad en esa función es que se pueden jugar ahora con valores superiores o inferiores en escalas proporcionales a la que colocamos por default que es 640 x 480.

Entonces bien ahora vamos a la siguiente cámara que es la de profundidad dando este codigo

void sensor_DepthFrameReady(object sender, DepthImageFrameReadyEventArgs e)
        {
            bool receivedData = false;

            using (DepthImageFrame CFrame = e.OpenDepthImageFrame())
            {
                if (CFrame == null)
                {
                }
                else
                {
                    pixel = new short[CFrame.PixelDataLength];
                    CFrame.CopyPixelDataTo(pixel);
                    receivedData = true;
                }
            }

            if (receivedData)
            {
                BitmapSource source = BitmapSource.Create(320, 240, 96, 96,
                        PixelFormats.Gray16, null, pixel, 320 * 4);

                DepthImage.Source = source;
            }
        }

Es el mismo tratamiento que explique en el método anterior pero lo que cambia es el formato de Pixeles y le colocamos Gray16 (PixelFormats.Gray16) y cambiamos la resolución a 320 x 240 claro también podemos colocarle la resolución de la otra cámara 640 x 480

Ahora corremos nuestra aplicación y tenemos las 2 camaras, tanto la de profundidad  como la RGB funcionando y habilitadas para trabajar con nuestra KINECT, es importante destacar que estos son los métodos básicos para tener  en funcionamiento estas 2 camaras, ya el resto queda de parte de nuestra creatividad

Estoy trabajando actualmente en el siguiente Tutorial para reconocimiento del personaje y de las librerías Skeleton para hacer infinidades de cosas con nuestro KINECT.

Salu2

Autor: hughfernandez

Software Arquitech Developer, Microsoft .NET And Xamarin developer, NUI Enthusiasm, Unreal 3D and Unity 3D engine developer, Fotball Fan, XBOX freak gamer!!..

15 comentarios en “Tutorial KINECT camaras RGB y de profundidad (DEPTH)”

  1. que tal hugo, me llama mucho la atencion todo lo relacionado con el kinect, el desarrollo de aplicaciones y de nuevas formas de interactuar con el usuario, ojala podamos platicar al respecto, me tratare de comunicar contigo. y de antemano gracias por poner un blog con ayuda en español para este tipo de ejemplossaludos desde mexico

    Me gusta

  2. Saludos tengo que realizar un proyecto con Kinect, y necesito de tu experiencia. Mi problema consiste en que vamos a preparar un Scanner y lo habiamos planeado de modo tal que fuese una plataforma la que enfocariamos, pero para ello debiamos colocar el kinect cera, y al ver las especificaciones del kinect nos dimos cuenta que la distancia a la que puede estar el kinect es de 1,2 metros, lo cual es demasiado.Necesito saber si habra alguna manera de usarlo un poco mas de cerca…favor respondeme a hojanico19@hotmail.com

    Me gusta

  3. Hola buenas noches, hace aproximadamente 2 semanas di con su blog, y ya me inscribí al grupo de facebook, tengo kinect, y ganas de hacer una dinámica para un proyecto orientado a niños. el punto por lo que le molesto, es que estaba haciendo este ejemplo pero al ejecutar la aplicación no me aparece nada, la duda que tengo es que si así debe ser el resultado o algo estoy haciendo mal. de antemano muchas gracias por compartir su conocimiento y tomarse el tiempo para leer estas líneas, Saludos desde México 🙂

    Me gusta

  4. Hola Amigo disculpa la tardanza eh estado muy ocupado y de verdad no me ha dado tiempo ni de pestañear jeje, justamente estaba en Mexico en el DF en un proyecto justamente con Kinect, bien deberías de comprobar las siguientes premisas1- El Kinect esta conectado2- Los drivers del dispositivo estén instalados3- Que la versión del SDK en el que estas desarrollando sea compatible con lo que postee aca4- Comprobar las referencias en la aplicación.con eso basta para que tu aplicación pueda funcionar, recuerda que existen métodos que inicializan las cámaras, tal vez te puede faltar eso, recuerda también que en el SDK que instalas hay demos en los cuales puedes probarlos y asi descartas que no hayan fallas en el Kinect…Espero sirva un poco lo que te acabo de sugerir cualquier duda mi Twitter @hughfernandez

    Me gusta

  5. hola, buen tutorial, pues yo al igual que otras 2 personas que acabo de leer sus comentarios, no hace nada el programa al correrlo. no es el SDK, ni tampoco el kinect, porque correo con los demos que trae el SDK

    Me gusta

    1. Checkea las siguientes cosas
      1- Kinect Conectado y bien instalado sus drivers y SDK
      2- Revisar bien la DLL que estas agregando como referencia

      nota: puedes probar si tu kinect ejecuta bien las aplicaciones con los demos de prueba que tiene el sdkToolkit

      recuerda que este ejemplo de camaras fue escrito en el 2012 bajo el SDK en su version 1.5

      cualquier cosa no dudes en escribirme a mi correo para revisar mas a fondo tu problema

      salu2

      Me gusta

      1. ya vi mi error:
        yo ponía este evento así como esta en tu codigo
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
        …….
        }
        pero en mi proyecto se llamaba con otro nombre el evento loaded:
        private void Ventana_Loaded(object sender, RoutedEventArgs e)
        {
        ……..
        }

        fue mi error, gracias 🙂

        Me gusta

  6. ami no me sale ningún error de compilación pero no hace nada me imagino debería de generar una secuencia de vídeo de las dos cámaras.
    sino que necesito precisamente la generación estas dos secuencias simultáneamente para llamar el código por medio de librerías .mex de matlab y generar un programa para reconocimiento facial

    Me gusta

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s