Подтвердить что ты не робот

Соответствие аудио Kinect с видео

У меня есть проект, посвященный видеоконференциям с использованием 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 к обычным компьютерам, а не к синему экрану. Я могу по-прежнему пытаться работать над этим в свободное время, но, насколько это работает, это почти тупик.

Спасибо за ответы, ребята, извините, я не мог опубликовать рабочее решение.

4b9b3361

Ответ 1

API, предоставляемый Microsoft Research, фактически не предоставляет эту возможность. Kinect - это, по существу, несколько камер и микрофонная матрица с каждым датчиком, имеющим уникальный стек драйверов, поэтому нет связи с физическим аппаратным устройством. Лучший способ добиться этого - использовать Windows API вместо этого с помощью WMI и взять идентификатор устройства, который вы получите для камеры NUI, и микрофоны, и использовать WMI, чтобы определить, к какой USB-шине они подключены (как и каждый Kinect датчик должен быть на собственной шине), тогда вы узнаете, какое устройство соответствует чему. Это будет дорогостоящей операцией, поэтому я бы рекомендовал вам сделать это при запуске или обнаружении устройств и сохранить информацию до тех пор, пока вы не измените конфигурацию аппаратного обеспечения, или приложение не будет reset. Использование WMI через .NET довольно хорошо документировано, но вот одна статья, в которой конкретно говорится об устройствах USB через WMI/.NET: http://www.developerfusion.com/article/84338/making-usb-c-friendly/.

Ответ 2

Маннимарко,

единственная ссылка, которую я вижу, заключается в том, что свойство UniqueDeviceName камеры равно ему "путь экземпляра устройства".

Проведя небольшое исследование в диспетчере устройств на моем компьютере, я могу сказать, что последние 2 номера в конце камеры UniqueDeviceName (0 и 3, 0 и 4) увеличивают значения (на основе контроллера + порт?).

Мое предложение состоит в том, что вы сортируете список камер на основе этих последних цифр и сортируете свои аудиовизоры в свойстве DeviceID. Таким образом, я предполагаю, что, когда вы перебираете список своих камер, вы можете использовать соответствующий индекс в списке аудиодекодов, чтобы совместить их вместе.

Btw, это мой первый пост, поэтому, пожалуйста, будьте осторожны, если я ошибаюсь...

Ответ 3

Я посмотрел документацию SDK, и это не очень здорово. Более того, у меня нет никаких устройств Kinect, чтобы проверить это.

Первое, что я хотел бы сделать, это создать список результатов всех полезных значений свойств для каждого устройства, после чего я начну искать совпадения между ними, которые выглядят так, как будто они могут использоваться для ссылок. Для каждого, который я нахожу, я бы проверил, будет ли он выполнять эту работу.

Итак, у меня было бы простое консольное приложение для вывода следующих значений свойств:

Для каждого AudioDeviceInfo

  • DeviceID = X
  • DeviceIndex = X
  • DeviceName = X

Для каждого источника KinectAudioSource

  • MicrophoneIndex = X

Для каждого времени выполнения

  • InstanceIndex = X

затем найдите любые совпадения в значениях. Ничто другое в SDK не кажется действительно полезным. Но внутри SDK должна быть внутренняя логика, когда она возвращает массивы AudioDeviceInfo и Runtime.

Во всяком случае, я надеюсь, что вы все поймете правильно.

Ответ 4

Я получаю аудиопоток от всех из них, а затем сравниваю уровни громкости. После этого вы можете определить "объект" или человека в 3d-пространстве kinects, который на самом деле говорит.

Оттуда вам нужно определить, какие камеры этот объект/человек видны в...

yeh это один сложный проект... kinect довольно классный, хотя... Я мало знаю об API, но разве это не дает вам дистанции и такие люди?

удачи с ним:)

Ответ 5

Я бы просто откалибровал кинут один за другим, записав в файл уникальные пары идентификаторов устройств (идентификатор камеры, идентификатор микрофона). В своем приложении вы можете использовать этот файл во время запуска для синхронизации экземпляров mircophone и экземпляров камеры (т.е. Создать таблицу, которая связывает экземпляр одной камеры с одним экземпляром микрофона). Поскольку у камеры и микрофона внутри kinect, возможно, есть свой собственный интерфейс usb ic каждый (подключенный через межсетевой USB-концентратор), технически невозможно связать два без предварительной калибровки, так как два идентификатора устройства, вероятно, полностью не связаны. Также вы можете поместить метки в блоки Kinect и ссылаться на эти метки внутри файла инициализации.

Ответ 6

Звучит интересно, может быть, вам нужна "автоматическая калибровка".

Возможно, с некоторыми "удаленными выключателями питания для каждого USB-соединения" (карта io, подключенная к линиям USB). Таким образом, вы можете автоматически включить один Kinect после другого, и теперь вы знаете, какой микрофон принадлежит камере.

Или что-то в этом роде...

Привет! Стефан