Hola!
Esta semana pondré un par de posts sobre el Kinect SDK v2 en los que sentaré las bases para los futuros ejemplos. Hoy toca mostrar como está organizado el SDK para capturar y mostrar el feed de la cámara del sensor.
Lo primero que vemos es que necesitamos trabajar con un elemento de tipo ColorFrameDescription (línea 14) donde se almancena la información relacionada con la cámara. Luego abrimos el reader de color de la cámara (línea 16) y también inicializamos un Bitmap (línea 18) que es el que está bindado a una Image de WPF.
1: public MainWindow()
2: {
3: _kinectSensor = KinectSensor.Default;
4: if (_kinectSensor != null)
5: {
6: _kinectSensor.Open();
7:
8: // get the coordinate mapper
9: _coordinateMapper = _kinectSensor.CoordinateMapper;
10: _bodies = new Body[_kinectSensor.BodyFrameSource.BodyCount];
11: _bodyReader = _kinectSensor.BodyFrameSource.OpenReader();
12:
13: // open the color reader for the color frames
14: var colorFrameDescription = _kinectSensor.ColorFrameSource.FrameDescription;
15:
16: _colorReader = _kinectSensor.ColorFrameSource.OpenReader();
17: _pixels = new byte[colorFrameDescription.Width * colorFrameDescription.Height * _bytesPerPixel];
18: _colorBitmap = new WriteableBitmap(colorFrameDescription.Width, colorFrameDescription.Height, 96.0, 96.0, PixelFormats.Bgr32, null);
19:
20: StatusText = "start";
21: }
22: else
23: {
24: // on failure, set the status text
25: StatusText = "something goes wrong";
26: }
27: Loaded += MainWindow_Loaded;
28: Closing += MainWindow_Closing;
29: DataContext = this;
30: InitializeComponent();
31: }
En el Load de la View nos suscribimos al evento de actualización del Reader y en el mismo agregamos el sigui3ente código:
1: void ColorReader_FrameArrived(object sender, ColorFrameArrivedEventArgs e)
2: {
3: var frameReference = e.FrameReference;
4: try
5: {
6: var frame = frameReference.AcquireFrame();
7: if (frame == null) return;
8: using (frame)
9: {
10: var frameDescription = frame.FrameDescription;
11:
12: Debug.WriteLine("frame width:" + frameDescription.Width + " bitmap pixel width:" + _colorBitmap.PixelWidth);
13: Debug.WriteLine("frame height:" + frameDescription.Height + " bitmap pixel height:" + _colorBitmap.PixelHeight);
14:
15: if ((frameDescription.Width == _colorBitmap.PixelWidth) && (frameDescription.Height == _colorBitmap.PixelHeight))
16: {
17: if (frame.RawColorImageFormat == ColorImageFormat.Bgra)
18: {
19: frame.CopyRawFrameDataToArray(_pixels);
20: }
21: else
22: {
23: frame.CopyConvertedFrameDataToArray(_pixels, ColorImageFormat.Bgra);
24: }
25:
26: _colorBitmap.WritePixels(
27: new Int32Rect(0, 0, frameDescription.Width, frameDescription.Height),
28: _pixels,
29: frameDescription.Width * _bytesPerPixel,
30: 0);
31: }
32: }
33: }
34: catch (Exception)
35: {
36: // ignore if the frame is no longer available
37: }
38: }
La sintaxis es batante clara, los pasos que seguimos en este punto son los siguientes
- Solicitamos el frame y validamos que el mismo no sea nulo
- Verificamos que el tamaño del frame coincida con el bitmap que creamos en el paso anterior
- Copiamos el array de bits de la imagen a Bitmap asociado con un IMAGE en WPF
- Done!
Comparado con la versión 1.X del KinectSdk la verdad que es bastante diferente. No estoy en posición de opinar sobre que versión es mejor, aunque creo que la V2 es más simple cuando se trabaja con varios aspectos del sensor al mismo tiempo, por ejemplo con body count y camara.
A seguir de vacaciones !!!
Disclaimer:
“This is preliminary software and/or hardware and APIs are preliminary and subject to change“
Saludos @ Home en Córdoba
El Bruno
![]() |
![]() |
![]() |
1 comment