Tips and Tricks Kinect

El día de hoy veremos cómo configurar a Kinect para Windows 2 como micrófono predeterminado en Skype.

Esta ocasión usaremos Skype para escritorio y el sdk 2.0 de Kinect

  1. Sí no tienes instalado el sdk preview 2.0 de Kinect descárgalo aquí
  2. En la ventana principal de tu cuenta de Skype da clic en el menú Herramientas
  3. OpcionesSkype con Kinect 1
  4. Configuración de sonidoSkype con Kinect 2
  5. Selecciona “Varios micrófonos (Xbox NUI Sensor)
  6. Guarda los cambiosSkype con Kinect 2

Y listo ya con esto quedará configurado Kinect para Windows 2 como micrófono en Skype

Mejoras en la API de audio

Mejoras:

  • KinectAudioSource ya no tiene un constructor, debe acceder a la propiedad de AudioSource KinectSensor. En múltiples escenarios KinectSensor será ahora quien asegure que usted obtiene la fuente de audio que es del sensor.
  • Cambia el nombre de la API
  • Refactorización API con la simplificación en mente.
  • La eliminación de muchos menos útiles miembros.
  • Propiedades que devuelven ángulos ahora devuelven ángulos en grados en lugar de radianes. Esto es consistente con ElevationAngle.

 

Código antiguo:

KinectAudioSource audioSource
newKinectAudioSource();

audioSource.SystemMode = SystemMode.OptibeamArrayOnly;

audioSource.FeatureMode = true;

audioSource.AutomaticGainControl = false;

audioSource.MicArrayMode = MicArrayMode.MicArrayAdaptiveBeam;

var kinectStream = audioSource.Start();

 

Código nuevo:

KinectAudioSource audioSource = kinectSensor.AudioSource;

audioSource.EchoCancellationMode =EchoCancellationMode.CancellationOnly;

audioSource.AutomaticGainControlEnabled = false;

audioSource.BeamAngleMode = BeamAngleMode.Adaptive;

var audioStream = audioSource.Start();

Cambios en el Skeleton API

  • Renombrado SkeletonEngine -> SkeletonStream
  • Renombrado SkeletonData -> Skeleton
  • Renombrado JointID -> Joint
  • Renombrado JointsCollection -> JointCollection
  • Vector Renombrado -> SkeletonPoint
  • Renombrado SkeletonQuality -> FrameEdges
  • Desarrollador es ahora responsable de propias asignaciones de variables de matriz esqueleto y esqueletos de copiado a ese almacenamiento.
  • La disponibilidad de datos esqueleto durante SkeletonFrameReady oAllFramesReady
    eventos. ( AllFramesReady da color a juego, profundidad
    y / o marcos esqueleto.)
  • Nuevos SkeletonStream.AppChoosesSkeletons   propiedad + ChooseSkeletonsmétodos ().

Código Viejo:

runtime.SkeletonFrameReady += new
EventHandler<SkeletonFrameReadyEventArgs>(nui_SkeletonFrameReady);

private void nui_SkeletonFrameReady(object

sender, SkeletonFrameReadyEventArgs
e)

{

SkeletonFrame skeletonFrame
= e.SkeletonFrame;

 

}

 

Código Nuevo:

kinectSensor.SkeletonFrameReady += new
EventHandler<SkeletonFrameReadyEventArgs>(nui_SkeletonFrameReady);

 

Skeleton[] skeletons;

 

private void
nui_SkeletonFrameReady(object
sender, SkeletonFrameReadyEventArgs
e)

{

bool receivedData
= false;

using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame())

{

if (skeletonFrame != null)

{

if
(skeletons == null) //allocate
the first time

{

skeletons = newSkeleton[skeletonFrame.SkeletonArrayLength];

}

receivedData
= true;

}

else

{

// Aplicaciones de procesamiento de datos esqueleto tomó demasiado tiempo; que obtuvo más de 2 cuadros detrás.

// La  información ya no es variable.

}

}

if (receivedData)

{

// PANTALLA  O IMAGEN PROCESO DE DATOS EN esqueletos AQUÍ

}

}

 

Cambios en el DepthImage API

Cambios significativos:

  • Reorganización de depthImage data. Ya no es un PlanarImage clase.
  • DepthPixel de datos es ahora un short [ ], en lugar de un byte []. (Imágenes fijas 2 bytes de datos que representan cada píxel.)
  • DepthPixel diseño bits es ahora consistente, sin importar si has optado por Profundidad + jugador o simplemente Profundidad.
  • Ya no hay necesidad de pedir Profundidad + jugador o profundidad. Si el SkeletonStream está habilitado, se obtiene Profundidad + jugador.
  • Desarrollador es ahora responsable de las asignaciones propias de pixeles variables y copia de pixeles para que el almacenamiento.
  • Disponibilidad dedepthImage datos durante DepthFrameReady o AllFramesReady
    (AllFramesReady da color a juego, la profundidad y / o marcos esqueleto.)

Código Antiguo:

runtime.DepthStream.Open(ImageStreamType.Depth, 2,ImageResolution.Resolution320x240,

ImageType.DepthAndPlayerIndex);

 

runtime.DepthFrameReady += new
EventHandler<ImageFrameReadyEventArgs>(DepthImageReady);

 

private void
DepthImageReady(object
sender, ImageFrameReadyEventArgs
e)

{

PlanarImage planarImage
= e.ImageFrame.Image;

 

// DISPLAY OR
PROCESS IMAGE DATA IN pixelData HERE

}

 

Código Nuevo:

kinectSensor.DepthStream.Enable(DepthImageFormat.Resolution320x240Fps30);

kinectSensor.DepthFrameReady += new

EventHandler<DepthImageFrameReadyEventArgs>(DepthImageReady);

short[] pixelData;

 

private void
DepthImageReady(object
sender, DepthImageFrameReadyEventArgs
e)

{

bool receivedData
= false;

using (DepthImageFrame depthImageFrame = e.OpenDepthImageFrame())

{

if (depthImageFrame != null)

{

if (pixelData == null) //allocate the first time

{

pixelData
= new short[depthImageFrame.PixelDataLength];

}

depthImageFrame.CopyPixelDataTo(pixelData);

receivedData
= true;

}

else

{

// apps processing of image data took too long; it got more than 2 frames behind.

// the data is no longer avabilable.

}

}

if (receivedData)

{

// DISPLAY OR PROCESS IMAGE DATA IN pixelData HERE

}

}

 

Cambios en ColorImage API

Cambios significativos:

  • Reorganización de los datos en colorimage.
  • Desarrolladorahora es responsable de las asignaciones propias de las variables pixelData y copia pixelData al almacenamiento. (Color pixelData todavía es una matriz de bytes con la misma disposición ).
  • KinectRuntime permite reutilizar recursos si se cae detrás deprocesamiento de datos de una aplicación.
  • Disponibilidad de colorimage datos durante ColorFrameReady o AllFramesReady eventos. ( AllFramesReady da color a juego, profundidad y / o marcos esqueleto.)

 

Código viejo:

runtime.VideoStream.Open(ImageStreamType.Video, 2,ImageResolution.Resolution640x480, ImageType.Color);

runtime.VideoFrameReady += new

EventHandler<ImageFrameReadyEventArgs>(ColorImageReady);

void ColorImageReady(object sender, ImageFrameReadyEventArgs e)

{

PlanarImage planarImage
= e.ImageFrame.Image;

 

// DISPLAY OR PROCESS IMAGE DATA IN planarImage HERE

}

 

Código nuevo:

kinectSensor.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30);

 

kinectSensor.ColorFrameReady += new
EventHandler<ColorImageFrameReadyEventArgs>(ColorImageReady);

byte[] pixelData;

 

void ColorImageReady(object sender, ColorImageFrameReadyEventArgs e)

{

bool receivedData
= false;

using (ColorImageFrame colorImageFrame = e.OpenColorImageFrame())

{

if (colorImageFrame != null)

{

if
(pixelData == null)
//allocate the first time

{

pixelData
= new byte[colorImageFrame.PixelDataLength];

}

colorImageFrame.CopyPixelDataTo(pixelData);

receivedData
= true;

}

else

{

procesamiento de datos de imágenes está tomando demasiado tiempo,se puso más de 2 cuadros detrás.

}

}

if (receivedData)

{

IMAGEN DE DATOS EN PROCESO de pixeles AQUÍ

}

}

Inicializar el sensor

Mejoras:

  • Permite habilitar una sola vez al desarrollador, no una vez por característica.
  • Los valores válidos son determinables a través de Instellisense/compilación y los errores no son solo en tiempo de ejecución.
  • Buen comportamiento predeterminado.

 

Código Antiguo:

runtime.Initialize (RuntimeOptions.UseDepthAndPlayerIndex |RuntimeOptions.UseSkeletalTracking |RuntimeOptions.UseColor );

runtime.VideoStream.Open (ImageStreamType.Video , 2,

ImageResolution.Resolution640x480,ImageType.Color );

runtime.DepthStream.Open (ImageStreamType.Depth , 2,

ImageResolution.Resolution320x240,ImageType.DepthAndPlayerIndex );

 

Código nuevo:

kinectSensor.ColorStream.Enable ();

kinectSensor.DepthStream.Enable ();

kinectSensor.SkeletonStream.Enable ();

kinectSensor.Start ();

Kinect para windows sdk v1.0 vs 2.0 Inicios

Hola y bienvenidos a este nuevo tutorial, en esta ocasión vamos a ver poco a poco las diferencias entre el sdk v1.0 y la última versión para que, sí desarrollabas para Kinect desde los antiguos SDK no te pierdas y puedas continuar desarrollando con este nuevo sensor.

KinectSensor Desinicializar/apagar el sensor

Código anterior:

Runtime.Unitialize();

Código nuevo:

KinectSensor.Stop();