読者です 読者をやめる 読者になる 読者になる

Natural Software

KinectなどのDepthセンサーを中心に活動しています

KINECT SDK Beta2 で、アプリを挿抜に対応させる( C++ ) #kinectsdk_ac

Kinect

このエントリは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#に比べると多少煩雑ですね。