首页 文章

将Kinect音频与视频匹配

提问于
浏览
28

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

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

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

UPDATE: 终于猛烈抨击WPF 's single thread apartment requirement and the Kinect audio'的多线程公寓要求足以让两人一起行动 . 问题是,据我所知,Kinect运行时对象和KinectAudioSources的顺序不对齐 . 我_752583_我可能是房间内的40名实习生之一,所以's hard to test, but I'相当确定订单是为我插入的两个Kinect切换的 . 我有两个运行时对象和两个KinectAudioSource对象 . 当第一个KinectAudioSource报告声音直接来自它前面时,我不能保证两者的命令排成一行 . 现在,重复一下这个问题:如何将KinectAudioSource对象与Nui.Runtime对象进行匹配?现在,我只有两个Kinects连接,但由于目标是四或五......我需要一个具体的方法来做到这一点 .

UPDATE 2: 把我在工作的两个Kinects带回家玩 . 三个Kinects,一台电脑 . 有趣的东西(实际上很难将它们全部安装到一起,其中一个视频源现在还没有回到2) . musefan 's answer got me hoping that I had missed something in the AudioDeviceInfo objects that would shed some light on this problem, but no luck. I found an interesting looking field in Runtime objects called NuiCamera.UniqueDeviceName, but I can' t在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)

UPDATE 3: 我'm not looking for calibration techniques. I'正在寻找一种方法,在运行时将Kinect摄像头与应用程序内的麦克风阵列相匹配,无需事先设置 . 请停止发布可能的校准技术 . 发布问题的全部意义在于找到避免用户进行设置的方法 .

UPDATE 4: WMI绝对是现在的样子 . 不幸的是,我还没有努力让3个Kinects互相玩得很开心 . 关于USB集线器无法处理带宽的事情?我似乎是将3个Kinect连接到普通计算机而不是蓝屏的简单方法 . 我可能仍然会在空闲时间尝试解决这个问题,但就工作而言......这几乎是一个死路一条 .

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

6 回答

  • 11

    Mannimarco,

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

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

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

    顺便说一句,这是我的第一篇文章,所以如果我错了请温柔......

  • 0

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

  • 0

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

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

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

    祝它好运:)

  • 0

    微软研究院提供的API没有你得到的NUI摄像头和麦克风,并使用WMI找到他们附加的USB总线(因为每个Kinect传感器必须在自己的总线上)然后你会知道哪个设备匹配什么 . 这将是一项昂贵的操作,因此我建议您在启动或检测设备时执行此操作,并保持信息持续到您知道硬件配置更改或应用程序重置为止 . 通过.NET使用WMI已经有了很好的文档,但是这篇文章通过WMI / .NET专门讨论了USB设备:http://www.developerfusion.com/article/84338/making-usb-c-friendly/ .

  • 3

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

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

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

    对于每个AudioDeviceInfo

    • DeviceID = X.

    • DeviceIndex = X.

    • DeviceName = X.

    对于每个KinectAudioSource

    • MicrophoneIndex = X.

    对于每个运行时

    • InstanceIndex = X.

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

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

  • 0

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

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

    或类似的东西...

    问候!斯特凡

相关问题