ブログ@kaorun55

HoloLensやKinectなどのDepthセンサーを中心に書いています。

Kinect for Windows SDK beta で遊んでみた #shibuya_ni

http://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/a/i/image.png
やっとMicrosoftに春が来て、Kinectの公式SDK Betaがリリースされました。
6/17の夜中にリリースイベントがありましたが、寝てしまっていたので、明るくなってから皆さんの情報をもとに遊んでみました:-)
今日一日やってみた情報をつらつら書いてみます。

リンク

システム要件

サポートしているOS
ハードウェア要件
Software Requirements

公式SDKのインストール

OpenNIと比べて、とても簡単です
こちらを参照してください:-)
まとめ?ブログ Kinect 2 -Kinect for Windows SDK 導入-

触ってみて感じたこと

Good
  • インストールが簡単
  • 首振りがある
  • オーディオデバイスがある
  • ポーズなしで骨格の検出ができる
  • 複数Kinectもいけるっぽい
  • Shape Game Sampleは管理者権限で実行する
Bad
  • 対応OSがWindows 7のみ
  • VMでできない
    • ProgrammingGuide_KinectSDK.pdfの8ページに記述がある(@shin_jedi さん、ありがとうございます)
      • Applications that are built with this SDK Beta must run in a native Windows environment. You cannot run applications in a virtual machine, because the Microsoft Kinect drivers and this SDK Beta must be installed on the computer that is running the application.
  • クリーンインストール状態のWindows7ではインストールに失敗する
    • Visual C++ 2010 Expressをいれたらインストールできたので、.NET Framework
  • OpenNI相当でNITEの部分はない
  • ネイティブはC++ではなくC
  • OpenNIにあるCapabilityや通知機能がない

開発環境

Visual Studio 2010 Premiumでの開発環境をこのしておきます。OSはWindows 7 x64、言語はC++です。

  • プロジェクトを作成する(今回はC++のコンソールアプリケーション)
  • 「プロジェクトのプロパティ|構成プロパティ|VC++ディレクトリ」を開き、下記のパスを追加
    • インクルードディレクトリ:「C:\Program Files (x86)\Microsoft Research KinectSDK\inc」
    • ライブラリディレクトリ:「C:\Program Files (x86)\Microsoft Research KinectSDK\inc」
    • x86なら「C:\Program Files (x86)\〜」→「C:\Program Files\〜」になる
  • 「プロジェクトのプロパティ|構成プロパティ|リンカー|入力」を開き、「追加の依存ファイル」に「MSRKinectNUI.lib」を追加
  • 下記コードを入力する
// アクティブなKinectの数を取得するサンプル
#include <iostream>

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

void main()
{
    int count = 0;
    ::MSR_NUIGetDeviceCount( &count );
    std::cout << count << " kinects" << std::endl;;
}
  • 実行すると接続されているKinectの数が表示される

おまけ

ネイティブがCとCOMインタフェースでアレなので、C#と似た構成のC++ラッパをちょっと作ってみました。(飽きなければ)少しずつ実装してみます。
こんな感じで首ふりできるようになりました。

// 首ふり
TEST( KinectTest, CameraElevationAngle )
{
    // SetAngle のあとに少し待たないと、GetAngleでエラーになる
    const int SLEEP_TIME = 1000;

#ifdef ANGLE_TEST
    kinect::nui::Kinect kinect;
    kinect.Initialize( NUI_INITIALIZE_FLAG_USES_DEPTH_AND_PLAYER_INDEX );

    // SetとGetの値は多少ずれる
    kinect.SetAngle( NUI_CAMERA_ELEVATION_MAXIMUM );
    ::Sleep( SLEEP_TIME );
    EXPECT_EQ( NUI_CAMERA_ELEVATION_MAXIMUM, kinect.GetAngle() );

    kinect.SetAngle( NUI_CAMERA_ELEVATION_MINIMUM );
    ::Sleep( SLEEP_TIME );
    EXPECT_EQ( NUI_CAMERA_ELEVATION_MINIMUM, kinect.GetAngle() );

    kinect.SetAngle( 0 );
    ::Sleep( SLEEP_TIME );
    EXPECT_EQ( 0, kinect.GetAngle() );
#endif
}


コードはgithubに置いてあります

最後に

毎度のことですが、Kinectをコンピュータから使うときは、単体版を購入してください。
KinectはUSBインタフェースではないので、USB接続するためにはUSB/電源ケーブルが別途必要です。XboxKinectの同梱版を買うとこの変換ケーブルがついていません。単体版では付いています。
もし同梱版を買ってしまったら、Microsoft Storeのサポートに電話するとUSB/電源ケーブル単体での購入も可能なようです(納期10日くらい)。

Xbox 360 Kinect センサー

Xbox 360 Kinect センサー