Kinectオーディオとビデオのマッチング 質問する

Kinectオーディオとビデオのマッチング 質問する

私は、Kinect (または、おそらく 4 台) を使用したビデオ会議を扱うプロジェクトを抱えています。現在、私の会社では、VTC ルームでこの非常に高価なカメラを使用しています。2 台の Kinect をリンクして使用することで、コストを削減できると期待しています。計画では、Kinect が部屋/テーブル全体を見ることができるように、4 台または 5 台の Kinect で 180 度の円弧をカバーする予定です (それでも、現在のカメラよりはるかに安価です)。アプリケーションは、テーブルで誰が話しているかに基づいて、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 に対応していることを知る方法が見つかりません。これは、私が使用している 2 つの Kinect では大きな問題ではありません (どちらがどちらかを推測し、間違っていたら切り替えます)。しかし、Kinect が 4 つまたは 5 つになったときに、アプリケーションを実行するたびに何らかの調整を行う必要があるのは望ましくありません。Runtime オブジェクトと KinectAudioSource オブジェクトが同じ順序 (Runtime インデックス 0 はデバイスの最初の AudioDeviceInfo に対応) であると想定することを検討しましたが、それは危険に思えます。

それで、質問です。Runtime オブジェクトをその KinectAudioSource と一致させる方法はありますか? そうでない場合、Runtime 0 をデバイスの最初の KinectAudioSource マイク インデックスと一致させることができるように、正しい順序になることが保証されますか?

アップデート:ついにWPFのシングルスレッドアパートメント要件とKinectオーディオのマルチスレッドアパートメント要件にぶつかり、2つを一緒に動作させることができました。問題は、私が知る限り、KinectランタイムオブジェクトとKinectAudioSourcesの順序がない整列します。私はかなり騒がしい研究室にいるので (私は部屋にいた 40 人ほどのインターンの 1 人です)、テストするのは難しいですが、接続した 2 つの Kinect の順序が入れ替わっていることはほぼ確実です。Runtime オブジェクトが 2 つと KinectAudioSource オブジェクトが 2 つあります。最初の KinectAudioSource が音が正面から来ていると報告するとき、私は実際には 2 番目の Runtime オブジェクトに関連付けられた Kinect の前に立っています。したがって、2 つの順序が整列する保証はありません。それでは、質問を繰り返します。KinectAudioSource オブジェクトを Nui.Runtime オブジェクトとどのように一致させるのでしょうか。現在、接続している Kinect は 2 つだけですが、目標は 4 つまたは 5 つなので、これを行うための具体的な方法が必要です。

更新2:職場にある 2 台の Kinect を家に持ち帰って遊んでみました。3 台の Kinect に 1 台のコンピューター。楽しいです (実際には一度にすべてインストールするのは大変でしたし、ビデオ フィードの 1 つが機能していないようなので、今のところ 2 台に戻っています)。musefan の回答を見て、この問題の解明に役立つ AudioDeviceInfo オブジェクト内の何かを見逃しているのではないかと期待しましたが、残念ながらダメでした。Runtime オブジェクトに NuiCamera.UniqueDeviceName という興味深いフィールドを見つけましたが、それと AudioDeviceInfo 内の何かの間には何もリンクが見つかりません。

シャーロック ホームズがスレッドを見て接続に気付くことを期待して、これらのフィールドから出力します。

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 を通常のコンピューターに接続してブルー スクリーンにならない簡単な方法はないようです。空き時間にこの作業に取り組もうかとも思いますが、作業に関しては、ほとんど行き詰まっています。

回答ありがとうございます。有効な解決策を投稿できず申し訳ありません。

ベストアンサー1

Microsoft Research が提供する API は、実際にはこの機能を提供していません。Kinect は基本的に複数のカメラとマイク アレ​​イで構成されており、各センサーには固有のドライバー スタックがあるため、物理ハードウェア デバイスとのリンクはありません。これを実現する最善の方法は、代わりに Windows API を WMI 経由で使用し、NUI カメラとマイクのデバイス ID を取得し、WMI を使用してそれらが接続されている USB バスを検索することです (各 Kinect センサーは独自のバス上にある必要があるため)。そうすれば、どのデバイスが何に対応しているかがわかります。これはコストのかかる操作なので、起動時またはデバイスの検出時にこれを実行し、ハードウェア構成が変更されたことがわかるまで、またはアプリケーションがリセットされるまで、情報を永続化しておくことをお勧めします。.NET 経由での WMI の使用については十分に文書化されていますが、WMI/.NET 経由の USB デバイスについて具体的に説明している記事が 1 つあります。http://www.developerfusion.com/article/84338/making-usb-c-friendly/

おすすめ記事