the glue

やってみたことで忘れそうなこと、役立ちそうなことなどをまとめています。たまに何気ない日常の話もします。

Visual C#でKinectを使う(その3)

さて前回は、KinectSensorクラスのインスタンスを作成し、Kinectのデータを取得する一歩手前までやっていきました。
ところで、Kinectからのデータが更新されたときに実行される関数を書き残していました。
Kinectから取得したデータをImage部品に表示するのに適した形式に変換する、便利なライブラリを導入したかったからなのですが、まずはこれを導入していきます。

Coding4Fun Kinect Toolkit

Kinectを使った開発には書かせないライブラリです。
今回は Kinectから取得したデータをImage部品に表示するのに適した形式に変換する のに使います。

ダウンロードと設置

まずはダウンロードしましょう。
以下のリンクから、右側にある 紫色の download ボタンをクリックするとダウンロードできます。

Coding4Fun Kinect Toolkit - Home

f:id:sweep3092:20140908232547p:plain

解凍すると中にはこのようなファイルが入っているのが確認できるかと思います。
この解凍したCoding4Fun.Kinect.Toolkitフォルダを、どこかわかりやすい場所に設置しておいてください。
Kinectにはこういった便利なライブラリがたくさん用意(公開)されているので、以下のようにKinect用のライブラリを保存しておくフォルダを作っておくとわかりやすいかと思います。

f:id:sweep3092:20140908232917p:plain

参照の追加

さて、設置したライブラリをVisual Studioで前回までに作成したプロジェクトから扱えるように参照の追加を行っていきましょう。
まずは前回までに作成したプロジェクトを開き、初回と同様に参照の追加ダイアログを表示させましょう。 f:id:sweep3092:20140907003539p:plain 参照の追加ダイアログが表示されたら、右下にある 参照 ボタンをクリックし、先ほど設置したフォルダから Coding4Fun.Kinect.Toolkit.Wpf.dll を追加してください。 追加されたら、チェックボックスをオンにして、OKボタンをクリックしてダイアログを閉じてください。

f:id:sweep3092:20140908233625p:plain

using

参照の追加を行ったら、Kinectを扱うクラスからCoding4Fun Kinect Toolkitを利用できるように、usingを追加しましょう。
以下のように、 using Microsoft.Kinect; の次の行に追加しておけば問題ないでしょう。

using Microsoft.Kinect;
// この行を追加
using Coding4Fun.Kinect.Wpf;

Kinectから取得したデータをウィンドウに表示

いよいよウィンドウに画像を表示するコードを書いていきます。
Kinectからのデータが更新されたときに実行される関数を書いたと思いますが、これを以下のように変更しましょう。

void kinect_ColorFrameReady( object sender, ColorImageFrameReadyEventArgs e )
{
    rgbCamera.Source = e.OpenColorImageFrame().ToBitmapSource();
}

左辺の rgbCamera.Source は、
Name が rgbCamera である部品の Source
を指しています。
つまり、前回書いた MainWindow.xaml の Image部品のSourceに相当します。
Image部品のSourceには、ImageSourceクラスのインスタンスを指定する必要があります。

右辺の e は前回の説明の通り、Kinectから送られてきたデータが入っていると考えてください。
OpenColorImageFrame() はColorImageFrameReadyEventArgsクラスのメソッドで、RGBカメラのデータのみを取得します。
ここで取得できるのはImageFrameクラスのインスタンスであり、そのままではImage部品のSourceに指定することはできません。

最後の ToBitmapSource() で、取得したデータを画像に変換しています。これは、先ほど導入したCoding4Funにより、ImageFrameクラスに追加されたメソッドです。
このメソッドはImageSourceクラスのインスタンスを返すため、ここで初めてImage部品のSourceに指定することができるようになります。

プログラムの実行

以上でKinectからRGBカメラの映像を取得してウィンドウに表示するプログラムは完成です。
Ctrl + F5 で デバッグなしで実行 を行うことができます。
しばらく待っているとウィンドウ現れ、ウィンドウにKinectの取得した映像が表示されていれば成功です。

表示されない場合は以下の可能性を疑いましょう

  • Kinectが接続されていない
  • Kinectに正しいドライバが設定されていない
  • ディスプレイドライバの問題
    • 最新のディスプレイドライバに更新するなどの対応をとりましょう
    • 仮想マシン上で実行しているWindowsの場合、正しく表示されない場合があります

おまけ

今回作成したプログラムはGithubリポジトリに上げてありますので、動かない場合は自分が書いたプログラムと比較してみてください。

sweep3092/kinect_introduction · GitHub