Kinect (または、おそらく 4 つ) を使用したビデオ会議を扱うプロジェクトがあります。現在、私の会社では、これらの非常に高価なカメラを VTC ルームに使用しています。希望は、Kinect をいくつかリンクして使用することで、コストを削減できることです。計画では、180 度の円弧をカバーする 4 つまたは 5 つのカメラを用意して、Kinects が部屋/テーブル全体を見ることができるようにする予定です (それでも、現在のカメラよりもはるかに安価です!)。アプリケーションは、テーブルで誰が話しているかに基づいて、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;
}
しかし、Runtime A が KinectAudioSource B に対応していることを知る方法が見つかりません。これは、私が使用している 2 つの Kinect にとって大きな問題ではありません (どちらがどちらであるかを推測し、間違っている場合は切り替えます)。ですが、Kinect が 4 つまたは 5 つになると、アプリケーションを実行するたびに何らかの調整を行う必要がなくなります。ランタイム オブジェクトと KinectAudioSource オブジェクトが同じ順序になると仮定することを検討しました (ランタイム インデックス 0 は、デバイスの最初の AudioDeviceInfo に対応します) が、それは危険に思えます。
そこで質問です: Runtime オブジェクトをその KinectAudioSource と一致させる方法はありますか? そうでない場合、Runtime 0 をデバイスの最初の KinectAudioSource マイク インデックスと一致させることができるように、それらが正しい順序になることが保証されていますか?
更新: 最後に、WPF のシングル スレッド アパートメント要件と Kinect オーディオのマルチ スレッド アパートメント要件に対して、2 つを一緒に動作させるのに十分なほど私の顔を叩きつけました。問題は、私が知る限り、Kinect ランタイム オブジェクトと KinectAudioSources の順序が正しくないことです。ラインナップ。私はかなりうるさい研究室にいるので (私は部屋にいる 40 人のインターンのうちの 1 人です)、テストするのは難しいですが、プラグインした 2 つの Kinect の順序が入れ替わっていることは確かです。 2 つの Runtime オブジェクトと 2 つの KinectAudioSource オブジェクトがあります。最初の KinectAudioSource が、サウンドがその真正面から来ていることを報告するとき、私は実際には 2 番目の Runtime オブジェクトに関連付けられた Kinect の前に立っています。したがって、2 人の注文が一致する保証はありません。さて、質問を繰り返します。KinectAudioSource オブジェクトと Nui.Runtime オブジェクトを一致させるにはどうすればよいでしょうか? 現在、Kinect を 2 つしか接続していませんが、目標は 4 つまたは 5 つなので、具体的な方法が必要です。
更新 2: 職場にある 2 台の Kinect を家に持ち帰って遊んでみました。3 台の Kinect、1 台のコンピューター。楽しいことです (一度にすべてをインストールするのは実際には面倒でした。また、ビデオ フィードの 1 つが機能していないように見えるので、今のところ 2 つに戻しています)。musefan の回答により、この問題に光を当てる AudioDeviceInfo オブジェクトの何かを見逃していたことを期待するようになりましたが、運はありませんでした。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 を通常のコンピューターに接続し、ブルー スクリーンを発生させない簡単な方法がないように思われることを上司に伝えました。私はまだ自由な時間にこれに取り組もうとするかもしれませんが、仕事に関する限り.. それはほとんど行き止まりです.
答えてくれてありがとう、申し訳ありませんが、実用的なソリューションを投稿できませんでした。