Top > Kinect > KinectForWindowsSDK > Basics > StartUp > InitializeKinect
Last-modified: Tue, 12 Jun 2012 15:51:26 JST
Counter:6424 Today:1 Yesterday:0 Online:6
このエントリーをはてなブックマークに追加

プログラムからKinectへの接続と初期化を行う

About

 このページではプログラム側からKinectへアクセスし、データを受け取るところまでを解説します。WindowsFormsやXNA、WPF、その他VisualStudioC#環境下に共通な処理です。各開発環境課でのサンプルプログラムを補足する資料となっているので、この資料は各開発環境課における最初のプログラム「カメラ画像の表示」を参照した後、理解が深まらない場合に参照してください。

 このページは先の項目「Kinectプログラミングのためのプロジェクト作成」までの内容が既知であることを前提としています。

Kinectの接続から終了までの全体の流れ

 まずは全体の流れを把握します。プログラムとKinectは次の様な手順で接続され、実行されます。

  • 1.繋いだKinectにアクセスするための変数を用意して、そこにKinectへのアクセスを確保する。
  • 2.Kinectからデータを貰うために、Kinectの初期化と設定を行う。
  • 3.Kinectからデータが送られてきた時の処理を実装する。
  • 4.Kinectの動作を開始する。
0.png
  • 5.Kinectからカメラデータ・深度データ・骨格データなどが送られてくる。
  • 6.手順3で実装された処理が実行される。
  • 7.手順5と6を繰り返す。
  • 8.Kinectを終了する。

Kinectの接続と開始

KinectSensor変数の用意とKinectへのアクセスの取得

1.png

 まず接続されたKinectへアクセスするための「Microsoft.Kinect.KinectSensorクラス」変数を用意します。

        /// <summary>
        /// Kinectを扱うクラス、そのインスタンス
        /// </summary>
        KinectSensor kinect;

 接続されたKinectへのアクセスは、通常はプログラムのエントリポイント(ないしコンストラクタ)で行います。接続されているKinect(へのアクセス)は「KinectSensor.KinectSensors[index]」によって配列の参照として取得します。これを先に用意した変数に代入し、Kinectへのアクセスを確保します。このとき参照のためのindex値は、接続されたKinectの内、どのKinectに接続するか、によって決定されます。例えば、Kinectが1台しか繋がっていない場合は、index=0番目のKinectへのアクセスを取得しますが、2台以上のKinectが接続されるとき、2番目のKinectへのアクセスを取得したい場合にはindexを1にする必要があります。

            //Kinectセンサーのインスタンスを得ます。
            //Kinectが一台も繋がっていない時はエラーになるので、上手く処理してください。
            this.kinect = KinectSensor.KinectSensors[0];

複数台のKinectへのアクセスを確保する事もできます。

Kinectが一台も接続されない時、KinectSensorsで取得できる配列は長さが0となります。よってKinectSensors[0]でアクセスするとnullを参照することに注意してください。ここでは簡単のため、例外処理について解説しません。

Kinectから受け取るデータの設定

2.png

 次にKinectから取得するデータを設定します。例えば、Kinectのカメラが映し出す映像を取得したい場合、次のソースコードのように「ColorStream.Enable()」として、文字通りカラー画像のストリーム(データの流れ)を有効化します。このとき取得するカメラ画像のフォーマット(≒種類)を「ColorImageFormat列挙体」によって指定します。ソースコードの例では「ColorImageFormat.RgbResolution640x480Fps30」を指定していますが、これは「解像度640x480のカメラの画像を30fpsで取得する」という設定になります。

            //Kinectのカメラ画像取得に関する設定を行います。
            //取得するデータのフォーマットを指定して、有効にします。
            kinect.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30);

 Kinectではカメラ画像以外に深度情報(画像)と骨格情報を取得することが出来ます。それらを取得するときもカメラと同様にストリーム(Stream)を有効にする必要があります。例えば次のソースコードのようになります。

//深度センサの有効化
kinect.DepthStream.Enable(DepthImageFormat.Resolution640x480Fps30);

//骨格トラッキングの有効化
kinect.SkeletonStream.Enable();

受信データを処理する機構の実装

3.png

 先の手順で有効にしたKinectの各ストリームから、プログラムがデータを受け取ったときの処理は、イベントハンドラを利用して実装します。例えばKinectからカメラ画像のデータが送られる度に、先に確保したKinectへのアクセスに「ColorFrameReadyイベント」が発生します。そのイベントに対して処理を行うイベントハンドラを設定すると、そのイベントハンドラ内で、受け取ったデータの中身を参照することができます。次のソースコードはColorFrameReadyイベントにイベントハンドラを設定した例です。

//Kinectがカメラ画像を読み込んだ場合に行う処理を設定します。
//実際の処理内容は、EventHandlerに設定したメソッドの内部で行われます。
this.kinect.ColorFrameReady
      += new EventHandler<ColorImageFrameReadyEventArgs>(kinect_ColorFrameReady);

Kinectの開始と開始後の動作

4.png

 Kinectからデータを受信した時の処理(イベントハンドラ)を実装したら、Kinectを開始します。「kinect.Start()」を一度実行すると「kinect.Stop()」を実行するまで、Kinectは定期的にデータをプログラム側に送信するようになります。そのデータを受信する度に、先に実装したイベントハンドラが実行される仕組みです。

this.kinect.Start();