我有一个使用Kinect(或更可能是其中的四个)处理视频 session 的项目。现在,我公司在我们的VTC session 室中使用这些价格昂贵的摄像机。希望是,使用一对链接在一起的Kinect,我们可以降低成本。计划是让它们中的四个/五个覆盖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);
每个麦克风阵列都使用:
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对应于KinectAudioSourceB。这对于我正在使用的两种Kinects来说不是一个大问题(我会猜测是哪一种,如果它们错了就切换它们) ,但是当我们最多使用4到5种Kinects时,我不需要每次运行应用程序时都进行任何类型的校准。我考虑过假设Runtime和KinectAudioSource对象的顺序相同(运行时索引0对应于设备中的第一个AudioDeviceInfo),但这似乎很冒险。
所以,问题是:有什么方法可以将运行时对象与其KinectAudioSource相匹配?如果不是,是否保证它们的顺序正确,以便我可以将Runtime 0与设备中的第一个KinectAudioSource麦克风索引匹配?
更新:
最后,我对WPF的单线程单元要求和Kinect音频的多线程单元要求大加抨击,以使两者相互配合。据我所知,问题是Kinect Runtime对象和KinectAudioSources的顺序不一致。我在一个相当吵闹的实验室中(我是房间中的40名实习生之一),因此很难测试,但我可以肯定地说,我插入的两种Kinect的顺序已切换。我有两个运行时对象和两个KinectAudioSource对象。当第一个KinectAudioSource报告声音直接来自它的前面时,我实际上是站在与第二个Runtime对象关联的Kinect前面。因此,不能保证两者的订单会对齐。因此,现在重复一个问题:如何将KinectAudioSource对象与Nui.Runtime对象进行匹配?现在,我只连接了两个Kinect,但是由于目标是四或五个,所以我需要一种具体的方法来实现。
更新2:
带上了我在家里玩的两种Kinect。三台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)
更新3:
我不是在寻找校准技术。我正在寻找一种在运行时将Kinect相机与其麦克风阵列匹配的方法,而无需事先设置。请停止发布可能的校准技术。发布问题的全部目的是找到一种避免用户进行设置的方法。
更新4:
WMI无疑是必经之路。不幸的是,我没有太多的时间去做,因为我一直在努力让3种Kinect相互配合。关于USB集线器无法处理带宽的事情?我已经通知我的老板,似乎没有任何简单的方法可以将3+ Kinects连接到常规计算机,而不是蓝屏。我可能仍会在空闲时间尝试解决此问题,但就工作而言,这几乎是一个死胡同。
谢谢你们的回答,对不起,我无法发布有效的解决方案。
最佳答案
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/。
关于c# - 将Kinect音频与视频匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6583746/