将Kinect音频与视频匹配

Coe*_*ect 28 c# kinect

我有一个使用Kinect处理视频会议的项目(或者更可能是其中四个).现在,我的公司为我们的VTC房间使用这些价格昂贵的相机.希望是,将几个Kinects联系在一起,我们可以降低成本.计划是让其中四个/五个覆盖180度弧线,这样Kinects就可以看到整个房间/桌子(仍然比我们现有的相机便宜很多!).应用程序将根据桌面上的对象选择来自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);
Run Code Online (Sandbox Code Playgroud)

每个麦克风阵列使用:

var source = new KinectAudioSource();
IEnumerable<AudioDeviceInfo> devices = source.FindCaptureDevices();
foreach( AudioDeviceInfo in device in devices)
{
    KinectAudioSource devSpecificSource = new KinectAudioSource();
    devSpecificSource.MicrophoneIndex = (short)device.DeviceIndex;
}
Run Code Online (Sandbox Code Playgroud)

但是我找不到任何方法可以知道运行时A对应于KinectAudioSource B.对于我正在使用的两个Kinect来说这不是一个大问题(我只是想猜哪个是哪个,如果它们错了就转换它们) ,但是当我们获得四到五个Kinects时,我不希望每次应用程序运行时都需要进行任何类型的校准.我已经考虑过假设Runtime和KinectAudioSource对象的顺序相同(运行时索引0对应于设备中的第一个AudioDeviceInfo),但这似乎有风险.

所以,问题是:有没有办法将Runtime对象与其KinectAudioSource匹配?如果没有,是否保证它们的顺序正确,那么我可以将Runtime 0与设备中的第一个KinectAudioSource麦克风索引相匹配?

更新: 最后猛烈抨击WPF的单线程公寓要求和Kinect音频的多线程公寓要求足以使两者一起行动.问题是,据我可以告诉,Kinect的运行对象和KinectAudioSources的顺序都没有排队.我在一个相当响亮的实验室(我是......可能是房间内的40名实习生之一),所以很难测试,但我很确定订单已经切换为我插入的两个Kinects.我有两个Runtime对象和两个KinectAudioSource对象.当第一个KinectAudioSource报告声音直接来自它前面时,我实际上站在与第二个Runtime对象关联的Kinect前面.所以不能保证两者的订单排成一行.现在,重复一下这个问题:如何将KinectAudioSource对象与Nui.Runtime对象进行匹配?现在,我只挂了两个Kinect,但由于目标是四个或五个......我需要一个具体的方法来做到这一点.

更新2: 带回我工作的两个Kinects回家玩.三个Kinects,一台电脑.有趣的东西(实际上很难将它们全部安装到一起,其中一个视频源似乎没有工作,所以我现在回到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)
Run Code Online (Sandbox Code Playgroud)

更新3: 我不是在寻找校准技术.我正在寻找一种方法在运行时将Kinect相机与应用程序中的麦克风阵列相匹配,而无需事先设置.请停止发布可能的校准技术.发布问题的全部意义在于找到避免用户进行设置的方法.

更新4: WMI绝对是最佳选择.不幸的是,我没有太多的时间去研究它,因为我一直在努力让3个Kinects相互配合.关于USB集线器无法处理带宽的事情?我告诉我的老板,似乎没有任何简单的方法可以将3+ Kinects连接到普通电脑而不是蓝屏.我可能仍然会在空闲时间尝试解决这个问题,但就工作而言......这几乎是一个死胡同.

谢谢你的回答,抱歉,我无法发布有效的解决方案.

Lew*_*nge 11

Microsoft Research提供的API实际上并未提供此功能.Kinect本质上是多个摄像头和麦克风阵列,每个传感器具有唯一的驱动器堆栈,因此没有与物理硬件设备的链接.实现这一目标的最佳方法是使用Windows API,通过WMI并获取NUI摄像头和麦克风所获得的设备ID,并使用WMI查找它们所连接的USB总线(如每个Kinect)传感器必须在自己的总线上)然后你会知道哪个设备匹配什么.这将是一项昂贵的操作,因此我建议您在启动或检测设备时执行此操作,并保持信息持续到您知道硬件配置更改或应用程序重置为止.通过.NET使用WMI已经有了很好的文档,但是这篇文章通过WMI/.NET专门讨论USB设备:http://www.developerfusion.com/article/84338/making-usb-c-friendly/.