"Kinect technologies permit us dream with the future"  [ESPAÑOL]  [ENGLISH]

Cámara RGB – ColorStream on!


Posted on enero 28th, by Marcal Montserrat in C#, Investigación y Desarrollo [I+D+I], Kinect, Kinect para Windows, Programación. 4 comments

Después del último post, donde enseñábamos a inicializar el sensor Kinect os explicaremos como acceder a la cámara RGB ampliando el último código facilitado.

Para ello empezaremos modificando el MainWindow.xaml introduciendo el objeto donde se mostrará la salida de la cámara. El código sería el siguiente:

[sourcecode language="xml"]
<Grid>
//el nombre puede ser el que queráis y el tamaño también.
<Image Name="CamaraRGB" Height="350" Width="525"></Image>
</Grid>
[/sourcecode]

Una vez preparado el XAML hay que programar el código para obtener los datos de la cámara RGB. Crearemos una función a la que hemos llamado ColorFrameReady. El código sería el siguiente:

[sourcecode language="csharp"]
private void ColorFrameReady(object sender, ColorImageFrameReadyEventArgs e)
{
using (ColorImageFrame frame = e.OpenColorImageFrame())
{
if (frame != null)
{
byte[] pixelData = new byte [ frame.PixelDataLength ];
frame.CopyPixelDataTo(pixelData);
//en el pixeldata está la info de la camara. si modificamos el pixel data podemos cambiar el color de la imagen

this._ColorImageBitmap.WritePixels(this._ColorImageBitmapRect, pixelData,
this._ColorImageStride, 0);
}
}
}
[/sourcecode]

Esta función lo que hace es recoger los datos que obtiene la cámara (frame = e.OpenColorImgeFrame) y los guarda en la variable pixelData para luego utilizarlos y actualizar la imagen a través del _ColorImageBitmap.WritePixels.

Esta función nos genera tres dependencias ColorImageBitmap, ColormageBitmapRect y el ColorImageStride. Para poder utilizarlas las declararemos y luego las inicializaremos dentro de la función InitializeKinectSensor.

[sourcecode language="csharp"]
//declaramos las variables

private WriteableBitmap _ColorImageBitmap;
private Int32Rect _ColorImageBitmapRect;
private int _ColorImageStride;

//las inicializamos dentro de la función initializekinectsensor.

this._ColorImageBitmap = new WriteableBitmap(colorStream.FrameWidth, colorStream.FrameHeight, 96, 96, PixelFormats.Bgr32, null);
this._ColorImageBitmapRect = new Int32Rect(0, 0, colorStream.FrameWidth, colorStream.FrameHeight);
this._ColorImageStride = colorStream.FrameWidth * colorStream.FrameBytesPerPixel;

[/sourcecode]

Aunque ya tenemos el programa acabado hemos dejado para el final lo más importante. Es cierto que el sensor ya está inicializado pero todavía no está recibiendo datos. Kinect puede trabajar con tres streams diferentes: ColorStream, DetphStream y SkeletonStream pero hay que indicarle cual queremos usar y hay que encender ese stream.

En nuestro caso, que queremos utilizar la cámara RGB, debemos utilizar el ColorStream. Para encenderlo introduciremos el siguiente código en la función InitializeKinectSensor:

[sourcecode language="csharp"]
ColorImageStream colorStream = sensor.ColorStream;
colorStream.Enable();
[/sourcecode]

Ahora ya tenemos el sensor inicializado y recibiendo datos del ColorStream. Así pues solo falta llamar a la función ColorFrameReady y pintar por pantalla el resultado. Las dos líneas siguientes realizan esta función y finalizan el código del programa (las introduciremos dentro de la función InitializeKinectSensor).

[sourcecode language="csharp"]
//llamamos al colorFrameReady que actualiza el mapa de bits.
sensor.ColorFrameReady += ColorFrameReady;

//enviamos los datos al objeto Image que hemos creado en el XAML.
CamaraRGB.Source = this._ColorImageBitmap;
[/sourcecode]

La función initialize debería quedar así:

[sourcecode language="csharp"]
private void InitializeKinectSensor(KinectSensor sensor)
{
if (sensor != null)
{
ColorImageStream colorStream = sensor.ColorStream;
colorStream.Enable();
this._ColorImageBitmap = new WriteableBitmap(colorStream.FrameWidth, colorStream.FrameHeight, 96,
96, PixelFormats.Bgr32, null);
this._ColorImageBitmapRect = new Int32Rect(0, 0, colorStream.FrameWidth,colorStream.FrameHeight);
this._ColorImageStride = colorStream.FrameWidth * colorStream.FrameBytesPerPixel;
sensor.ColorFrameReady += ColorFrameReady;
CamaraRGB.Source = this._ColorImageBitmap;
sensor.Start();
}
}

[/sourcecode]

El resultado debería ser un vídeo en color como si de una videocámara e tratara.

print_rgb





4 thoughts on “Cámara RGB – ColorStream on!

  1. Hola, me encantan estos posts sobre Kinect.

    Quería deciros que en la línea 7 de la función ImageFrameReady cuando construís el array de bytes usais paréntesis cuando se deberían usar corchetes, tal que quedase new byte [frame.PixelDataLength]

    Lo digo porque se me pasó ese detalle al seguir el post y Visual Studio te lo marca como error porque claramente no es un constructor válido. Saludos!

    • Hola Mark,

      Sentimos los problemas que te puede haber causado el tipo de explicación utilizada en este post pero creemos que para entender el funcionamiento de Kinect hay que ir paso por paso para saber que hace cada línea en cada momento.

      De todos modos siempre puedes contar con nosotros para preguntarnos tus dudas o exponer los problemas que te vayan surgiendo a medida que vas programando con Kinect.

      Gracias.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>



Últimos POST »

En Kinect for Developers trabajamos para tener actualizado nuestro Blog, con las últimas noticias y novedades sobre Kinect.
También vamos publicando información y detalles sobre todas las aplicaciones y proyectos que desarrollamos desde Kinect for Developers.

» Recomendamos visitar asiduamente nuestro Blog para estar a la última sobre Kinect.

Características Kinect 2

Dicen que lo bueno se hace esperar. Somos “pocos”los que hemos podido hacernos con un ejemplar del nuevo sensor de Microsoft, el Kinect for...

Kinect for Windows SDK 1.8

El 17 de septiembre salió a la luz la versión 1.8 del SDK para Kinect. Posiblemente este post debería haberse hecho entonces pero la...