Kinect for Windows SDK 入門3:カメラ基礎

UI (ユーザーインターフェース)のデザイン

  • MainWindow.xamlに2つの320x240イメージコントロールを追加
    • XAMLのWindowのWidthの値を800に変える
    • 画面左上のToolboxよりAll WPF Controls下のImageをGrid内にドラッグアンドドロップ
    • 画面右下のproperty画面にて、Layout項目でWidthを320、Heightを240に設定
    • そのImageを選択し、Ctr+C, Ctr+Vで複製してGrid内に以下のように並べる


ランタイムの初期化

Window_Loaded eventの中で、runtimeを必要なオプションで初期化する。
今回は、カラーセンサーと深度センサーを使うので以下のようになる。

nui.Initialize(RuntimeOptions.UseColor | RuntimeOptions.UseDepth);

VideoFrameReady eventを許可

  • RGBカメラから値を読み取るために、Kinect RuntimeのVideoFrameReady eventの為のハンドラーをWindow_Loaded event内に追加。
    • "nui.VideoFrameReady +="と入力しtabキーを二回打つことでVisual Studioが自動的にnui_VideoFrameReadyイベントのコードも追加してくれる。
  • 同様に深度センサーから値を読み取るために、DepthFrameReady eventの為のハンドラをWindow_Loadedイベント内に追加し、nui_DepthFrameReadyイベントも作成。
  • 次に、それらのイベントを使うために、それぞれをWindow_Loadedイベント内でopenする
nui.VideoStream.Open(ImageStreamType.Video, 2, ImageResolution.Resolution640x480, ImageType.Color);
nui.DepthStream.Open(ImageStreamType.Depth, 2, ImageResolution.Resolution320x240, ImageType.Depth);
  • 送り値
    • タイプでストリームのタイプを指定
    • プールサイズ
      • キューできるバッファの数。一つの表示のために一つが使われる。最小で2つ使え、数が多くなるほどスムーズになるが待ち時間も長くなる。
    • 解像度
    • Typeを指定

nui_VideoFrameReady

video frame readyが返す値

The video frameはImageFrame classを含むImageFrameReadyEventArgsを返す。
そのImageFrame classは以下の2つを含む

  1. イメージのメタデータ。
    • ImageType(それが深度イメージなのか、カラーイメージなのか)や、イメージのサイズを知るための解像度など
  2. イメージ
    • Bits byte[] array に格納されたイメージそのもののデータ

よって、そのbyte[] arrayをimageに変換する作業が必要となる。

Gridの中に作ったImage control(image1)に、その変換したimageを表示するためには、BitmapSource.Create メゾットを呼ぶ。
よって、nui_VideoFrameReadyイベントの中身は以下のようになる。

PlanarImage image = e.ImageFrame.Image;//imageの作成
image1.Source = BitmapSource.Create(image.Width, image.Height, 96, 96, PixelFormats.Bgr32, null, image.Bits, image.Width * image.BytesPerPixel);      
  • 送り値
    • 高さ
    • インチごとのドットの数(幅)
    • インチごとのドットの数(高さ)
    • イメージのフォーマット
    • ビットマップパレット
    • ピクセルの配列
    • Stride
      • widthとpaddingの合計

ただし上記のコードの二行目は、Coding4Fun Kinect Toolkitの拡張メゾットを使うことによって、以下のように単純に書ける

image1.Source = e.ImageFrame.ToBitmapSource();

nui_DepthFrameReady

VideoFrameReadyの時と似ているが、深度データはピクセルごとのセンサーからの距離を格納した配列を使う。
Coding4Fun Kinect Toolkitを用いることにより、nui_DepthFrameReadyの中身は以下の一行のみで深度を表示することが可能になる。

image2.Source = e.ImageFrame.ToBitmapSource();

実行してみると以下のように表示される。