gpt4 book ai didi

c# - 将 Kinect 音频与视频相匹配

转载 作者:IT王子 更新时间:2023-10-29 04:14:58 26 4
gpt4 key购买 nike

我有一个项目处理使用 Kinect(或更可能是其中四个)的视频 session 。现在,我的公司在我们的 VTC session 室使用这些极其昂贵的摄像机。希望是,使用连接在一起的几个 Kinect,我们可以降低成本。计划是让其中四个/五个覆盖 180 度弧度,以便 Kinects 可以看到整个房间/ table (仍然比我们当前的相机便宜很多!)。应用程序将根据餐 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;
}

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

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

更新:
最后猛烈抨击 WPF 的单线程单元要求和 Kinect 音频的多线程单元要求,足以让两者一起表现。问题是,据我所知,Kinect 运行时对象和 KinectAudioSources 的顺序不一致。我在一个相当嘈杂的实验室(我是房间里 40 名实习生中的一个),所以很难测试,但我相当确定我插入的两个 Kinect 的顺序已经改变。我有两个运行时对象和两个 KinectAudioSource 对象。当第一个 KinectAudioSource 报告直接从它前面发出声音时,我实际上站在与第二个运行时对象关联的 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 连接到普通计算机而不是蓝屏。我可能仍然会在空闲时间尝试做这件事,但就工作而言……这几乎是一个死胡同。

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

最佳答案

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com