28

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 を通常のコンピューターに接続し、ブルー スクリーンを発生させない簡単な方法がないように思われることを上司に伝えました。私はまだ自由な時間にこれに取り組もうとするかもしれませんが、仕事に関する限り.. それはほとんど行き止まりです.

答えてくれてありがとう、申し訳ありませんが、実用的なソリューションを投稿できませんでした。

4

6 に答える 6

11

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

于 2011-07-13T04:22:32.693 に答える
3

マニマルコ、

私が見る唯一のリンクは、カメラのUniqueDeviceNameプロパティがその「デバイスインスタンスパス」と等しいことです。

コンピューターのデバイスマネージャーを少し調べてみると、カメラのUniqueDeviceName(0&3、0&4)の最後にある最後の2つの数字は、値が増加していることがわかります(コントローラー+ポートに基づいていますか?)。

私の提案は、これらの最後の桁に基づいてカメラのリストを並べ替え、DeviceIDプロパティでオーディオデバイスを並べ替えることです。このように、カメラリストを反復処理するときに、オーディオデバイスリストの対応するインデックスを使用して2つを一致させることができると思います。

ところで、これは私の最初の投稿ですので、私が間違っている場合は優しくしてください...

于 2011-07-13T14:58:44.770 に答える
0

興味深いですね。「自動キャリブレーション」が必要かもしれません。

たぶん、「USB接続ごとにリモート電源スイッチ」(USB電力線に接続されたioカード)がいくつかあります。したがって、Kinect の電源を次々と自動的にオンにすることができ、どのマイクがどのカメラに属しているかがわかります。

またはそのようなもの...

よろしく!ステファン

于 2011-07-13T14:11:25.373 に答える
0

それらすべてからオーディオ ストリームを取得し、音量レベルを比較します。それを取得したら、実際に話している kinects 3d 空間内の「オブジェクト」または人物を特定できます。

そこから、このオブジェクト/人物がどのカメラに表示されているかを判断する必要があります...

ええ、これは 1 つの複雑なプロジェクトです... kinect はかなり素晴らしいですが ... API についてはあまり知りませんが、距離などはわかりませんか?

頑張ってください:)

于 2011-07-12T16:04:59.637 に答える
0

SDK のドキュメントを確認しましたが、正直なところあまり良くありません。さらに、これをテストするための Kinect デバイスがありません。

私が最初に行うことは、各デバイスのすべての有用なプロパティ値の出力リストを作成することです。次に、リンクに使用できるように見える 2 つの一致を探し始めます。見つけたものごとに、それが機能するかどうかをテストします。

したがって、次のプロパティ値を出力する単純なコンソール アプリケーションが必要です。

各 AudioDeviceInfo について

  • デバイス ID = X
  • DeviceIndex = X
  • デバイス名 = X

KinectAudioSource ごとに

  • マイクインデックス = X

ランタイムごとに

  • インスタンス インデックス = X

次に、一致する値を探します。SDK には、他に本当に役立つものはありません。ただし、SDK が AudioDeviceInfo と Runtime の配列を返すときは、SDK に内部ロジックが必要です。

ともかく、何とか治りますように

于 2011-07-12T15:59:29.147 に答える
0

kinect を 1 つずつ調整し、一意のデバイス識別子のペア (カメラ ID、マイク ID) をファイルに書き込みます。アプリケーションでは、起動時にそのファイルを使用して、マイクのインスタンスとカメラのインスタンスを同期できます (つまり、1 つのカメラ インスタンスを 1 つのマイク インスタンスに関連付けるテーブルを作成します)。kinect 内のカメラとマイクはおそらくそれぞれ独自の USB インターフェイス ic (内部 USB ハブを介して接続) を持っているため、2 つのデバイス識別子はおそらく完全に無関係であるため、技術的には事前のキャリブレーションなしに 2 つを関連付ける方法はありません。また、Kinect ユニットにラベルを付けて、初期化ファイル内でこれらのラベルを参照することもできます。

于 2011-07-12T23:46:38.130 に答える