将Kinect音频与视频匹配

时间:2011-07-05 13:52:15

标签: 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);

每个麦克风阵列使用:

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运行时对象和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)

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

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

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

6 个答案:

答案 0 :(得分: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/

答案 1 :(得分:3)

Mannimarco,

我看到的唯一链接是摄像机的UniqueDeviceName属性等于它的'设备实例路径'。

在我的计算机上的设备管理器中进行一些研究我可以看出摄像机的UniqueDeviceName(0&amp; 3,0和4)末尾的最后2个数字是递增值(基于控制器+端口?)。

我的建议是,您根据最后的数字对摄像机列表进行排序,并在其DeviceID属性上对您的audiodevices进行排序。这样我想当你迭代你的摄像机列表时,你可以使用audiodevice列表中的相应索引来匹配2。

是的,这是我的第一篇文章,所以如果我错了,请保持温柔......

答案 2 :(得分:0)

我已经看过SDK文档了,但并不是很好。更多我没有任何Kinect设备来测试它。

我要做的第一件事就是为每个设备创建一个包含所有有用属性值的输出列表,然后我会开始寻找两者之间的匹配,看起来它们可以用于链接。对于我发现的每一个,我会测试它是否能完成这项工作。

所以我会有一个简单的控制台应用程序来输出以下属性值:

对于每个AudioDeviceInfo

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

对于每个KinectAudioSource

  • MicrophoneIndex = X

For Each Runtime

  • InstanceIndex = X

然后在值中查找任何匹配项。 SDK中的其他任何内容似乎都没有用。但是当SDK返回AudioDeviceInfo和Runtime的数组时,必须有内部逻辑。

无论如何,我希望你能以某种方式做到正确

答案 3 :(得分:0)

我会从所有这些音频流中获取音频流,然后比较音量级别。 一旦你有了,你可以确定实际说话的kinects 3d空间中的“对象”或人。

从那里你需要确定这个物体/人在哪个相机中可见......

是的,这是一个复杂的项目......虽然kinect很棒但是......我对API知之甚少,但是它不会给你带来距离和这样的人吗?

祝你好运:)

答案 4 :(得分:0)

我只是逐个校准运动,将唯一的设备标识符对(摄像机ID,麦克风ID)写入文件。在您的应用程序中,您可以在启动时使用该文件来同步mircophone实例和摄像头实例(即创建一个将一个摄像头实例与一个麦克风实例相关联的表)。由于kinect内部的摄像头和麦克风可能每个都有自己的usb接口ic(通过内部usb集线器连接),因此技术上无法在没有事先校准的情况下将两者相关联,因为两个设备标识符可能完全不相关。您还可以在Kinect单元上放置标签,并在初始化文件中引用这些标签。

答案 5 :(得分:0)

听起来很有意思,也许你需要一些“自动校准”。

可能有一些“每个usb连接的远程电源开关”(io卡连接到usb电源线)。所以你可以自动接通一个Kinect,现在你知道哪个麦克风属于哪个摄像头。

或类似的......

问候!   斯蒂芬