studio software microsoft for desarrollo con c# kinect

c# - software - microsoft kinect dll



Coincidencia de audio Kinect con video (6)

Tengo un proyecto relacionado con la videoconferencia utilizando Kinect (o, 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, utilizando un par de Kinects conectados, podamos reducir los costos. El plan es tener cuatro / cinco de ellos cubriendo un arco de 180 grados para que los Kinect puedan ver toda la sala / mesa (¡aún es mucho más barato que nuestras cámaras actuales!). Las aplicaciones elegirían un flujo de video proveniente de un Kinect basado en quién está hablando en la mesa. El plan está bien en teoría, pero me he encontrado con un problema.

Por lo que puedo decir, no hay manera de saber qué matriz de micrófono corresponde al objeto Kinect Runtime. Puedo obtener un objeto que representa cada 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 utilizando:

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 Runtime A corresponde a KinectAudioSource B. Esto no es un gran problema para los dos Kinects que estoy usando (solo adivinaré cuál es cuál, y los cambiaré si están equivocados) , pero cuando obtenemos hasta cuatro o cinco Kinects, no quiero tener que realizar ningún tipo de calibración cada vez que se ejecuta la aplicación. He considerado suponer que los objetos Runtime y KinectAudioSource estarán en el mismo orden (el índice de tiempo de ejecución 0 corresponde a la primera AudioDeviceInfo en los dispositivos), pero eso parece peligroso.

Entonces, la pregunta: ¿hay alguna manera de hacer coincidir un objeto Runtime con su KinectAudioSource? De no ser así, ¿se garantiza que estarán en el orden correcto para que coincida con Runtime 0 con el primer índice de micrófono de KinectAudioSource en los dispositivos?

ACTUALIZACIÓN: Finalmente, golpeé mi cara contra el requisito de apartamento de subproceso único de WPF y el requisito de apartamento de subproceso múltiple de audio de Kinect lo suficiente como para que ambos se comportaran juntos. El problema es que, por lo que puedo decir, el orden de los objetos de tiempo de ejecución de Kinect y KinectAudioSources no se alinean. Estoy en un laboratorio bastante ruidoso (soy uno de ... tal vez 40 internos en la sala), por lo que es difícil de probar, pero estoy bastante seguro de que el orden ha cambiado para los dos Kinects que he conectado. Tengo dos objetos Runtime y dos objetos KinectAudioSource. Cuando el primer KinectAudioSource informa que viene un sonido directamente enfrente de él, realmente estoy parado frente al Kinect asociado con el segundo objeto Runtime. Así que no hay garantía de que los pedidos de los dos se alinearán. Así que ahora, para repetir la pregunta: ¿cómo relaciono el objeto KinectAudioSource con el objeto Nui.Runtime? En este momento, solo tengo dos Kinects conectados, pero como el objetivo es cuatro o cinco ... Necesito una forma concreta de hacerlo.

ACTUALIZACIÓN 2: Traje los dos Kinects que tengo en el trabajo en casa para jugar. Tres Kinects, una computadora. Cosas divertidas (en realidad fue un dolor tenerlos todos instalados a la vez, y uno de los videos no parece estar funcionando, por lo que estoy de regreso a 2 por ahora). La respuesta de musefan me hizo esperar que hubiera perdido algo en los objetos AudioDeviceInfo que arrojarían algo de luz sobre este problema, pero no hubo suerte. Encontré un campo de aspecto interesante en los objetos Runtime llamado NuiCamera.UniqueDeviceName, pero no puedo encontrar ningún enlace entre eso y nada en AudioDeviceInfo.

Salida de esos campos, con la esperanza de que Sherlock Holmes vea el hilo y note 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 buscando técnicas de calibración. Estoy buscando una manera de hacer coincidir la cámara Kinect con su conjunto de micrófonos dentro de la aplicación en tiempo de ejecución, sin necesidad de configuración previa. Por favor, deje de publicar posibles técnicas de calibración. Todo el punto de publicación de la pregunta era encontrar una manera de evitar que el usuario realice la configuración.

ACTUALIZACIÓN 4: WMI definitivamente parece ser el camino a seguir. Desafortunadamente, no he tenido mucho tiempo para trabajar en ello, ya que he estado luchando solo para lograr que 3 Kinects jueguen bien entre ellos. ¿Algo sobre que los concentradores USB no puedan 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 pantalla azul. Es posible que aún intente trabajar en esto en mi tiempo libre, pero en lo que respecta al trabajo ... es prácticamente un callejón sin salida.

Gracias por las respuestas, chicos, lo siento, no pude publicar una solución de trabajo.


He echado un vistazo a la documentación del SDK y no es muy bueno con toda honestidad. Además, no tengo ningún dispositivo Kinect para probar esto.

Lo primero que haría sería crear una lista de salida de todos los valores de propiedades útiles para cada dispositivo, luego comenzaría a buscar coincidencias entre los dos que parecen que pueden usarse para los enlaces. Para cada uno que encuentre, me gustaría probar si funciona.

Así que tendría una aplicación de consola simple para generar los siguientes valores de propiedad:

Para cada AudioDeviceInfo

  • ID de dispositivo = X
  • DeviceIndex = X
  • DeviceName = X

Para cada KinectAudioSource

  • MicrophoneIndex = X

Para cada runtime

  • InstanceIndex = X

luego busca cualquier coincidencia en los valores. Nada más en el SDK parece realmente útil. Pero debe haber una lógica interna en el SDK cuando devuelve las matrices de AudioDeviceInfo y Runtime.

De todos modos, espero que lo hagas bien de alguna manera


La API proporcionada por Microsoft Research en realidad no proporciona esta capacidad. Kinect es esencialmente una cámara múltiple y una matriz de micrófonos con cada sensor que tiene una pila de controladores única, por lo que no hay vínculos con el dispositivo de hardware físico. La mejor manera de lograr esto sería utilizar la API de Windows en lugar de WMI y tomar los ID de dispositivo que obtiene para la cámara NUI y los micrófonos, y usar WMI para encontrar a qué bus USB están conectados (como cada Kinect el sensor tiene que estar en su propio bus) entonces sabrá qué dispositivo coincide con qué. Esta será una operación costosa, por lo que le recomendaría que lo haga en el inicio o la detección de los dispositivos y mantenga la información persistente hasta el momento en que sepa que la configuración del hardware cambia o la aplicación se restablece. El uso de WMI a través de .NET está bastante bien documentado, pero aquí hay un artículo que habla específicamente sobre dispositivos USB a través de WMI / .NET: http://www.developerfusion.com/article/84338/making-usb-c-friendly/ .


Mannimarco,

El único enlace que veo es que la propiedad UniqueDeviceName de una cámara es igual a la "ruta de la instancia del dispositivo".

Al investigar un poco en el administrador de dispositivos de mi computadora, puedo decir que los últimos 2 números al final de UniqueDeviceName de la cámara (0 y 3, 0 y 4) están incrementando los valores (¿se basan en el controlador + puerto?).

Mi sugerencia es que ordene su lista de cámaras en función de esos últimos dígitos y ordene sus dispositivos de audio en su propiedad DeviceID. De esta manera, supongo que cuando recorres tu lista de cámaras, puedes usar el índice correspondiente en la lista de dispositivos de audio para hacer coincidir los dos.

Por cierto, esta es mi primera publicación, así que sé amable si me equivoco ...


Obtendría el flujo de audio de todos ellos y luego compararía los niveles de volumen. Una vez que tenga eso, puede determinar el "objeto" o la persona en el espacio 3d de kinects que realmente está hablando.

A partir de ahí, debe determinar en qué cámaras se ve este objeto / persona en ...

Sí, este es un proyecto complejo ... kinect es bastante asombroso ... No sé mucho sobre la API, pero ¿no te da distancias y semejantes personas?

Suerte con ello :)


Simplemente calibraría los kinects uno por uno, escribiendo los pares únicos de identificadores de dispositivos (id de cámara, id de micrófono) en un archivo. En su aplicación, puede usar ese archivo en el momento de inicio para sincronizar las instancias de mircophone y las instancias de cámara (es decir, crear una tabla que relacione una instancia de cámara con una instancia de micrófono). Como la cámara y el micrófono en el interior del kinect probablemente tienen su propia interfaz USB ic (conectada a través de un concentrador USB interal), técnicamente no hay forma de relacionar los dos sin una calibración previa, ya que los dos identificadores del dispositivo probablemente no están relacionados. También es posible que desee colocar etiquetas en las unidades Kinect y hacer referencia a estas etiquetas dentro de su archivo de inicialización.


Suena interesante, tal vez necesitas algo de "calibración automática".

Tal vez con algunos "interruptores de alimentación remotos para cada conexión usb" (tarjeta io conectada a las líneas de alimentación usb). Por lo tanto, puede encender un Kinect después del otro automáticamente y ahora sabe qué micrófono pertenece a qué cámara.

O algo así...

¡Saludos! Stefan