Tengo un proyecto que trata sobre videoconferencia usando Kinect (o, más probablemente, cuatro de ellos). En este momento, mi empresa utiliza estas cámaras estúpidamente caras para nuestras salas de VTC. La esperanza es que, usando un par de Kinects unidos entre sí, podamos reducir los costos. El plan es tener cuatro/cinco de ellos cubriendo un arco de 180 grados para que los Kinects puedan ver toda la habitación/mesa (¡aún mucho más barato que nuestras cámaras actuales!). Las aplicaciones elegirían un flujo de video proveniente de un Kinect en función de quién está hablando en la mesa. Plan está bien en teoría, pero me he encontrado con un problema.Coincidencia de audio Kinect con video
Por lo que puedo decir, no hay forma de saber qué matriz de micrófonos corresponde al objeto Kinect Runtime. Puedo conseguir un objeto que representa cada uno de Kinect usando:
Device device = new Device();
Runtime[] kinects = new Runtime[device.Count];
for(int i = 0; i < kinects.Length; i ++)
kinects[i] = new Runtime(i);
Y cada conjunto de micrófonos usando:
var source = new KinectAudioSource();
IEnumerable<AudioDeviceInfo> devices = source.FindCaptureDevices();
foreach(AudioDeviceInfo in device in devices)
{
KinectAudioSource devSpecificSource = new KinectAudioSource();
devSpecificSource.MicrophoneIndex = (short)device.DeviceIndex;
}
pero no puedo encontrar ninguna manera de saber que en tiempo de ejecución A corresponde a KinectAudioSource B. Esto no es un gran problema para los dos Kinects que estoy usando (voy a adivinar cuál es cuál, y cambiarlos si están equivocados), pero cuando tengamos hasta cuatro o cinco Kinects, no quiero tener que hacer cualquier tipo de calibración cada vez que se ejecuta la aplicación. Considero suponer que los objetos Runtime y KinectAudioSource estarán en el mismo orden (el índice de tiempo de ejecución 0 corresponde al primer AudioDeviceInfo en dispositivos), pero parece riesgoso.
Entonces, la pregunta: ¿hay alguna forma de hacer coincidir un objeto Runtime con su KinectAudioSource? De lo contrario, ¿está garantizado que estarán en el orden correcto para que pueda hacer coincidir Runtime 0 con el primer índice de micrófono KinectAudioSource en dispositivos?
ACTUALIZACIÓN: Por último se estrelló contra la cara requisito apartamento individual hilo de WPF y múltiples requisito de que el audio de Kinect apartamento hilo suficiente para que los dos se comporten juntos. El problema es que, por lo que puedo ver, el orden de los objetos Kinect Runtime y KinectAudioSources no se alinea en . Estoy en un laboratorio bastante ruidoso (soy uno de ... tal vez 40 pasantes en la sala), así que es difícil de probar, pero estoy bastante seguro de que el orden se cambia para los dos Kinect que he conectado. Tengo dos objetos Runtime y dos objetos KinectAudioSource. Cuando el primer KinectAudioSource informa que un sonido proviene directamente de él, en realidad me encuentro frente al Kinect asociado con el segundo objeto Runtime. Por lo tanto, no hay garantía de que los pedidos de los dos se alineen. Entonces, para repetir la pregunta: ¿cómo puedo unir el objeto KinectAudioSource con el objeto Nui.Runtime? En este momento, solo tengo dos Kinects conectados, pero dado que el objetivo es cuatro o cinco ... Necesito una forma concreta de hacerlo.
ACTUALIZACIÓN 2: Trajé los dos Kinects que tengo en el trabajo a casa para jugar. Tres Kinects, una computadora. Cosas divertidas (en realidad fue un fastidio tenerlas todas instaladas a la vez, y una de las transmisiones de video no parece estar funcionando, así que estoy de vuelta a 2 por ahora). La respuesta de musefan me hizo esperar que me hubiera perdido algo en los objetos AudioDeviceInfo que arrojaría algo de luz sobre este problema, pero no tuve suerte. Encontré un campo de aspecto interesante en objetos Runtime llamado NuiCamera.UniqueDeviceName, pero no encuentro ningún vínculo entre eso y nada en AudioDeviceInfo.
La producción de estos campos, con la esperanza de Sherlock Holmes ve el hilo y da cuenta de una conexión:
Console.WriteLine("Nui{0}: {1}", i, nuis[i].NuiCamera.UniqueDeviceName);
//Nui0: USB\VID_0409&PID_005A\6&1F9D61BF&0&4
//Nui1: USB\VID_0409&PID_005A\6&356AC357&0&3
Console.WriteLine("AudioDeviceInfo{0}: {1}, {2}, {3}", audios.IndexOf(audio), device.DeviceID, device.DeviceIndex, device.DeviceName);
//AudioDeviceInfo0: {0.0.1.00000000}.{1945437e-2d55-45e5-82ba-fc3021441b17}, 0, Microphone Array (Kinect USB Audio)
//AudioDeviceInfo1: {0.0.1.00000000}.{6002e98f-2429-459a-8e82-9810330a8e25}, 1, Microphone Array (2- Kinect USB Audio)
Actualización 3: no estoy en busca de técnicas de calibración.Estoy buscando una manera de hacer coincidir la cámara Kinect con su matriz de micrófonos dentro de la aplicación en tiempo de ejecución, sin necesidad de configuración previa. Por favor deja de publicar posibles técnicas de calibración. El objetivo de publicar la pregunta fue encontrar la manera de evitar que el usuario tenga que configurarlo.
ACTUALIZACIÓN 4: WMI definitivamente parece ser el camino a seguir. Desafortunadamente, no he tenido mucho tiempo para trabajar en él, ya que he estado luchando solo para que 3 Kinects jueguen bien entre ellos. ¿Algo sobre los concentradores USB que no pueden manejar el ancho de banda? Le informé a mi jefe que no parece haber una manera fácil de conectar 3+ Kinects a una computadora normal y no a una pantalla azul. Todavía podría tratar de trabajar en esto en mi tiempo libre, pero en lo que respecta al trabajo ... es casi un callejón sin salida.
Gracias por las respuestas chicos, lo siento, no pude publicar una solución de trabajo.
I * piensa * He oído en alguna parte que el SDK en la actualidad sólo le permite obtener audio de un dispositivo a la vez .. . Podría estar equivocado en eso, pero es posible que desee verificar antes de ir demasiado lejos en este camino. –
Existe una limitación en el seguimiento del esqueleto y en el mapa de profundidad (solo puede obtenerlo desde el Kinect primario), pero no hay limitaciones en el audio hasta donde yo sé. Me aseguraré de eso pronto. – Coeffect
Para cualquiera que lea mi comentario: me equivoqué, puede obtener información detallada de cualquier Kinect. La información esqueletal aún está limitada al Kinect primario, y por lo tanto, la información del índice del jugador también lo está. – Coeffect