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

Natural Software

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

Kinect for Windows SDK beta で遊んでみた 〜 MSSDK-OpenNI-Bridgeで遊ぶ 〜 #shibuya_ni

Kinect

Kinect for Windows SDK beta で遊んでみた 〜 MS Kinect SDK のドライバで OpenNIを動かす 〜 #shibuya_ni - かおるんダイアリー
前回は、MS 公式 Kinect SDK のドライバでOpenNIを動かしてみました。
今回は、公式SDKとOpenNIを使った簡単なサンプルを動かしてみようと思います。

やったこと

OpenNIでカメラ画像を表示しながら、公式SDKで首を振ってます。従来のOpenNI環境では実現できなかった動作です。

ソース

Kinect本のカメラサンプルに公式SDKの首振りを加えたものです。
SampleConfig.xmlも手を入れて、ソースの下に掲載しています。

#include <iostream>
#include <stdexcept>

#include <opencv/cv.h>
#include <opencv/highgui.h>

#include <XnCppWrapper.h>

// MSR_NuiApi.hの前にWindows.hをインクルードする
#include <Windows.h>
#include <MSR_NuiApi.h>

// 設定ファイルのパス(環境に合わせて変更してください)
const char* CONFIG_XML_PATH = "SamplesConfig.xml";

int main (int argc, char * argv[])
{
    IplImage* camera = 0;

    try {
        // MS公式SDKを初期化する
        HRESULT ret = ::NuiInitialize( NUI_INITIALIZE_FLAG_USES_COLOR );
        if ( ret != S_OK ) {
            throw std::runtime_error("NuiInitialize failed");
        }
 
        // OpenNIを初期化する
        xn::Context context;
        XnStatus rc = context.InitFromXmlFile(CONFIG_XML_PATH);
        if (rc != XN_STATUS_OK) {
            throw std::runtime_error(xnGetStatusString(rc));
        }

        // OpenNIのイメージジェネレータを作成する
        xn::ImageGenerator image;
        rc = context.FindExistingNode(XN_NODE_TYPE_IMAGE, image);
        if (rc != XN_STATUS_OK) {
            throw std::runtime_error(xnGetStatusString(rc));
        }

        // カメラサイズのイメージを作成(8bitのRGB)
        XnMapOutputMode outputMode;
        image.GetMapOutputMode(outputMode);
        camera = ::cvCreateImage(cvSize(outputMode.nXRes, outputMode.nYRes),
            IPL_DEPTH_8U, 3);
        if (!camera) {
            throw std::runtime_error("error : cvCreateImage");
        }

        // 起動からの時間
        DWORD tick = ::GetTickCount();

        // メインループ
        while (1) {
            // OpenNIでカメライメージの更新を待ち、画像データを取得する
            context.WaitOneUpdateAll(image);
            xn::ImageMetaData imageMD;
            image.GetMetaData(imageMD);

            // カメラ画像の表示
            //  Kinectからの入力がRGBであるため、BGRに変換して表示する
            memcpy(camera->imageData, imageMD.RGB24Data(), camera->imageSize);
            ::cvCvtColor(camera, camera, CV_RGB2BGR);
            ::cvShowImage("KinectImage", camera);

            // キーの取得
            char key = cvWaitKey(10);
            // 終了する
            if (key == 'q') {
                break;
            }

            // 1秒に一回、公式SDKでKinectの首を動かす
            if ( (::GetTickCount() - tick) > 1000 ) {
                tick =::GetTickCount();

                LONG angle = 0;
                ::NuiCameraElevationGetAngle( &angle );
                if ( angle < NUI_CAMERA_ELEVATION_MAXIMUM ) {
                    ::NuiCameraElevationSetAngle( angle + 5 );
                }
                else {
                    ::NuiCameraElevationSetAngle( 0 );
                }
            }
        }

        ::NuiCameraElevationSetAngle( 0 );
        ::NuiShutdown();
    }
    catch (std::exception& ex) {
        std::cout << ex.what() << std::endl;
    }

    ::cvReleaseImage(&camera);

    return 0;
}
<OpenNI>
    <Licenses>
        <License vendor="PrimeSense" key="0KOIk2JeIBYClPWVnMoRKn5cdY4=" />
    </Licenses>
    <Log writeToConsole="false" writeToFile="false">
        <!-- 0 - Verbose, 1 - Info, 2 - Warning, 3 - Error (default) -->
        <LogLevel value="1"/>
        <Masks>
            <Mask name="ALL" on="false"/>
        </Masks>
        <Dumps>
        </Dumps>
    </Log>
    <ProductionNodes>
        <Node type="Image" name="Image1">
            <Configuration>
                <MapOutputMode xRes="640" yRes="480" FPS="30"/>
            </Configuration>
        </Node>
        <Node type="Depth" name="Depth1">
            <Configuration>
                <MapOutputMode xRes="640" yRes="480" FPS="30"/>
            </Configuration>
        </Node>
        <Node type="User" name="User1">
            <Query>
                <Name>MSRKinectUserSkeletonGenerator</Name>
            </Query>
        </Node>
    </ProductionNodes>
</OpenNI>