将Kinect音频与视频匹配

本文关键字:视频 Kinect 音频 | 更新日期: 2023-09-27 18:01:18

我有一个使用Kinect(或者更有可能是四个)进行视频会议的项目。现在,我们公司用这些贵得离谱的摄像机来装职业培训中心的房间。我们的希望是,使用几个连接在一起的kinect,我们可以降低成本。我们的计划是让4/5个这样的摄像头覆盖180度的弧度,这样kinect就可以看到整个房间/桌子(仍然比我们现在的摄像头便宜得多!)这些应用程序会根据坐在桌前说话的人来选择来自Kinect的视频流。这个计划在理论上是可行的,但我遇到了一个困难。

据我所知,没有办法判断哪个麦克风阵列对应于Kinect运行时对象。我可以使用

获取代表每个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.这不是一个巨大的问题,我正在使用的两个Kinects(我只是猜测哪个是哪个,如果他们是错误的切换他们),但当我们得到四个或五个Kinects,我不想需要做任何类型的校准每次应用程序运行。我考虑过假设运行时和KinectAudioSource对象将以相同的顺序(运行时索引0对应于设备中的第一个AudioDeviceInfo),但这似乎有风险。

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

更新:最后,我对WPF的单线程公寓要求和Kinect音频的多线程公寓要求进行了抨击,这足以让两者合二为一。问题是,据我所知,Kinect Runtime对象和KinectAudioSources的顺序并没有对齐。我在一个很吵的实验室里(我是…也许房间里有40个实习生),所以很难测试,但我相当肯定,我插入的两个kinect的顺序是颠倒的。我有两个Runtime对象和两个KinectAudioSource对象。当第一个KinectAudioSource报告声音直接来自它的前方时,我实际上是站在与第二个Runtime对象相关联的Kinect前面。所以不能保证两者的顺序是一致的。现在,重复一下这个问题:我如何匹配KinectAudioSource对象和Nui。运行时对象?现在,我只连接了两个kinect,但既然目标是四五个…我需要一个具体的方法来做这件事。

更新2:

把我在公司的两个玩具带回家玩。三个kinect,一台电脑。有趣的东西(实际上一次安装它们是一件很痛苦的事情,而且其中一个视频馈送似乎不起作用,所以我现在回到2个)。musefan的回答让我希望我在AudioDeviceInfo对象中遗漏了一些可以解释这个问题的东西,但是没有运气。我在运行时对象中发现了一个有趣的名为nuiccamera的字段。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+ kinect连接到普通电脑上而不出现蓝屏。我可能仍然会尝试在空闲时间做这件事,但就工作而言……这几乎是一条死胡同。

谢谢大家的回答,抱歉我不能发布一个可行的解决方案。

将Kinect音频与视频匹配

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

Mannimarco,

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

在我计算机上的设备管理器中做了一点研究,我可以告诉相机的UniqueDeviceName(0& 3,0 &4)末尾的最后两个数字是递增值(基于控制器+端口?)。

我的建议是,你排序你的相机列表基于那些最后的数字,并排序你的audiodevices在他们的DeviceID属性。这样,我想当你迭代你的相机列表时,你可以使用audiodevice列表中相应的索引来匹配这两个。

顺便说一句,这是我的第一个帖子,所以如果我错了,请温柔…

我看了一下SDK文档,老实说它不是很好。此外,我没有任何Kinect设备来测试这个。

我要做的第一件事是为每个设备创建一个所有有用的属性值的输出列表,然后我将开始在两个设备之间寻找看起来可以用于链接的匹配。对于我找到的每一个,我都会测试看看它是否起作用。

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

For Each AudioDeviceInfo

  • DeviceID = X
  • DeviceIndex = X
  • 设备名称= X

For Each KinectAudioSource

  • MicrophoneIndex = X

For每个Runtime

  • InstanceIndex = X

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

无论如何,我希望你得到它的正确方式

我会得到所有的音频流,然后比较音量水平。一旦你有了这些,你就可以确定在kinect 3d空间中真正说话的"物体"或人。

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

是的,这是一个复杂的项目…不过Kinect确实很棒……我不太了解API,但它不是能给你距离之类的人吗?

祝你好运:)

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

听起来很有趣,也许你需要一些"自动校准"

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

或者类似的…

问候!Stefan