このエントリはKINECT SDK Advent Calendar 2011 : ATNDの12月20日分です!!
Advent Calendarでの、僕の全プロジェクトはこちらです
今日までで、C#,F#,VBの挿抜サンプルが出ていますが、C++がないのでやってみます。
画面などはなくてもいいので、コンソールアプリで作りました。
コード
やってることはC#などと同じですね。肝になる「MSR_NuiSetDeviceStatusCallback」がドキュメントにはなく、サンプルを見て動きを把握しました。プロジェクトはこちら
#include <windows.h> #include <conio.h> #include <iostream> #include <MSR_NuiApi.h> int GetDeviceCount() { int count = 0; ::MSR_NUIGetDeviceCount( &count ); return count; } void CALLBACK StatusProc( const NuiStatusData* data ) { std::cout << GetDeviceCount() << " KINECT(s)" << std::endl; std::wcout << "Name : " << data->instanceName << " Status : " << (SUCCEEDED( data->hrStatus ) ? " connect" : " disconnect") << std::endl; } void main() { std::cout << GetDeviceCount() << " KINECT(s)" << std::endl; ::MSR_NuiSetDeviceStatusCallback( &::StatusProc ); while ( ::_kbhit() == 0 ) { ::Sleep( 100 ); } }
挿抜イベントの登録
コールバック関数を指定します。
::MSR_NuiSetDeviceStatusCallback( &::StatusProc );
挿抜イベント
挿抜イベントが発生すると呼ばれます。hrStatus に状態が入っています。hrStatusがSUCCEEDEDであれば正常に接続され、それ以外は抜かれたことをあらわします。また、KINECTの電源が入っていない場合にもSUCCEEDEDがfalseになります。
接続されているKINECTの数はMSR_NUIGetDeviceCountで取得できるので、その値-1(zero origin)をMSR_NuiCreateInstanceByIndexに入れれば、そのKINECTのインスタンスが取得できるでしょう。
void CALLBACK StatusProc( const NuiStatusData* data ) { std::cout << GetDeviceCount() << " KINECT(s)" << std::endl; std::wcout << "Name : " << data->instanceName << " Status : " << (SUCCEEDED( data->hrStatus ) ? " connect" : " disconnect") << std::endl; }
まとめ
同じデバイスの、同じライブラリなので、やることは同じですが、C#に比べると多少煩雑ですね。