我有一个使用 Kinect(或者更有可能是其中四个)处理视频会议的项目。现在,我的公司在我们的 VTC 房间里使用这些极其昂贵的摄像头。希望是,使用连接在一起的几个 Kinect,我们可以降低成本。计划是让其中四个/五个覆盖一个 180 度的弧线,以便 Kinect 可以看到整个房间/桌子(仍然比我们目前的相机便宜很多!)。应用程序会根据桌边的谈话者来选择来自 Kinect 的视频流。计划在理论上很好,但我遇到了障碍。
据我所知,没有办法知道哪个麦克风阵列对应于 Kinect Runtime 对象。我可以使用以下方法获取代表每个 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;
}
但我找不到任何方法来知道运行时 A 对应于 KinectAudioSource B。这对于我正在使用的两个 Kinect 来说不是一个大问题(我只是猜测哪个是哪个,如果它们错了就切换它们) ,但是当我们使用多达四五个 Kinect 时,我不想在每次应用程序运行时都进行任何类型的校准。我考虑过假设 Runtime 和 KinectAudioSource 对象的顺序相同(运行时索引 0 对应于设备中的第一个 AudioDeviceInfo),但这似乎有风险。
那么问题来了:有什么方法可以将 Runtime 对象与其 KinectAudioSource 匹配?如果不是,是否保证它们的顺序正确,以便我可以将 Runtime 0 与设备中的第一个 KinectAudioSource 麦克风索引匹配?
更新: 最后猛烈抨击了 WPF 的单线程单元要求和 Kinect 音频的多线程单元要求,足以让两者一起行动。问题是,据我所知,Kinect Runtime 对象和 KinectAudioSources 的顺序不排队。我在一个相当吵闹的实验室里(我是房间里可能有 40 名实习生之一),所以很难测试,但我相当肯定我插入的两个 Kinect 的顺序已经切换。我有两个 Runtime 对象和两个 KinectAudioSource 对象。当第一个 KinectAudioSource 报告声音来自它的正前方时,我实际上是站在与第二个 Runtime 对象关联的 Kinect 前面。所以不能保证两人的订单会排成一行。所以现在,重复这个问题:我如何将 KinectAudioSource 对象与 Nui.Runtime 对象匹配?现在,我只连接了两个 Kinect,但由于目标是四五个……我需要一个具体的方法来做到这一点。
更新 2: 把我工作中的两台 Kinect 带回家玩。三台 Kinect,一台电脑。有趣的东西(一次安装它们实际上很痛苦,而且其中一个视频源似乎不起作用,所以我现在回到 2)。musefan 的回答让我希望我错过了 AudioDeviceInfo 对象中的某些内容,这些内容可以阐明这个问题,但没有运气。我在名为 NuiCamera.UniqueDeviceName 的运行时对象中发现了一个有趣的字段,但我找不到它与 AudioDeviceInfo 中的任何内容之间的任何链接。
这些字段的输出,希望 Sherlock Holmes 看到线程并注意到连接:
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 个 Kinect 相互配合。关于 USB 集线器无法处理带宽的问题?我已经告诉我的老板,似乎没有任何简单的方法可以将 3+ Kinects 连接到普通计算机而不是蓝屏。我可能仍然会在空闲时间尝试做这件事,但就工作而言……这几乎是一条死胡同。
感谢大家的回答,抱歉我无法发布有效的解决方案。