У меня есть проект, посвященный видеоконференциям с использованием Kinect (или, более вероятно, четыре из них). Прямо сейчас, моя компания использует эти глупо дорогие камеры для наших помещений VTC. Надежда состоит в том, что с использованием пары Kinects, связанных между собой, мы можем снизить затраты. План состоит в том, чтобы иметь четыре/пять из них, охватывающих 180-градусную дугу, чтобы Kinects могли видеть всю комнату/стол (все еще намного дешевле, чем наши нынешние камеры!). Приложения выбирали бы видеопоток, исходящий от Kinect, на основе того, кто за столом разговаривает. План теоретический, но я столкнулся с проблемой.
Насколько я могу судить, нет способа определить, какая микрофонная матрица соответствует объекту Runtime Kinect. Я могу получить объект, представляющий каждый Kinect, используя:
Device device = new Device();
Runtime[] kinects = new Runtime[device.Count];
for( int i = 0; i < kinects.Length; i ++ )
kinects[i] = new Runtime(i);
И каждый массив микрофонов, используя:
var source = new KinectAudioSource();
IEnumerable<AudioDeviceInfo> devices = source.FindCaptureDevices();
foreach( AudioDeviceInfo in device in devices)
{
KinectAudioSource devSpecificSource = new KinectAudioSource();
devSpecificSource.MicrophoneIndex = (short)device.DeviceIndex;
}
но я не могу найти никакого способа узнать, что Runtime A соответствует KinectAudioSource B. Это не огромная проблема для двух Kinect, которые я использую (я просто догадаюсь, что это такое, и переключите их, неверно), но когда мы получаем до четырех или пяти Kinect, я не хочу, чтобы каждый раз при каждом запуске приложения выполнялась какая-либо калибровка. Я предположил, что объекты Runtime и KinectAudioSource будут в одном порядке (индекс времени выполнения 0 соответствует первому устройству AudioDeviceInfo), но это кажется рискованным.
Итак, вопрос: есть ли способ сопоставления объекта Runtime с его KinectAudioSource? Если нет, гарантировано ли, что они будут в правильном порядке, чтобы я мог совместить Runtime 0 с первым индексом микрофона KinectAudioSource в устройствах?
UPDATE: Наконец, я ударил лицо по требованию квартиры WPF для одиночной нити и требованию многоквартирного многоканального звука Kinect достаточно, чтобы заставить обоих вести себя вместе. Проблема в том, насколько я могу судить, порядок объектов Runtime Kinect и KinectAudioSources не выстраиваются в линию. Я в довольно громкой лаборатории (я одна из... может быть, 40 стажеров в комнате), поэтому трудно проверить, но я уверен, что заказ переключается на два Kinect, которые я подключил. У меня есть два объекта Runtime и два объекта KinectAudioSource. Когда первый KinectAudioSource сообщает, что звук идет прямо перед ним, я фактически стоит перед Kinect, связанным со вторым объектом Runtime. Таким образом, нет никакой гарантии, что приказ двух будет выстраиваться в линию. Итак, теперь, чтобы повторить вопрос: как мне сопоставить объект KinectAudioSource с объектом Nui.Runtime? Прямо сейчас у меня есть только два Kinects, но, поскольку цель - четыре или пять. Мне нужен конкретный способ сделать это.
ОБНОВЛЕНИЕ 2: Принесли два Kinect, с которыми я работаю, чтобы вернуться домой, чтобы поиграть. Три Kinects, один компьютер. Увлекательный материал (на самом деле это было больно, чтобы все они были установлены сразу, и один из видеопотоков, похоже, не работает, поэтому я вернулся к 2 на данный момент). musefan ответ заставил меня надеяться, что я пропустил что-то в объектах AudioDeviceInfo, которые прольют некоторый свет на эту проблему, но не повезло. Я нашел интересное поле в объектах Runtime под названием NuiCamera.UniqueDeviceName, но я не могу найти никакой связи между этим и ничего в AudioDeviceInfo.
Вывод из этих полей, в надежде, что Шерлок Холмс видит поток и замечает соединение:
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)
ОБНОВЛЕНИЕ 3: Я не ищу методы калибровки. Я ищу способ сопоставления камеры Kinect с микрофонным массивом в приложении во время выполнения, без необходимости в предыдущей настройке. Пожалуйста, прекратите публикацию возможных методов калибровки. Весь смысл публикации вопроса заключался в том, чтобы найти способ избежать необходимости настройки пользователя.
ОБНОВЛЕНИЕ 4: WMI определенно похоже на путь. К сожалению, у меня не было много времени, чтобы поработать над этим, так как я изо всех сил пытаюсь заставить 3 Kinects хорошо играть друг с другом. Что-то о USB-концентраторах, которые не могут обрабатывать пропускную способность? Я сообщил своему начальнику, что, похоже, нет простого способа подключения 3+ Kinects к обычным компьютерам, а не к синему экрану. Я могу по-прежнему пытаться работать над этим в свободное время, но, насколько это работает, это почти тупик.
Спасибо за ответы, ребята, извините, я не мог опубликовать рабочее решение.