Hatena::ブログ(Diary)

明日とロボット このページをアンテナに追加 RSSフィード

2011-06-22

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

Kinect入門

  1. Kinect for Windows SDK 入門1: Kinectセンサーのインストール
  2. Kinect for Windows SDK 入門2 開発環境のセットアップ
  3. Kinect for Windows SDK 入門3:カメラ基礎
  4. Kinect for Windows SDK 入門4:骨格トラッキングと3D表示

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内に以下のように並べる

f:id:astrobot:20110622073631j:image

ランタイムの初期化

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の合計

f:id:astrobot:20110622071115j:image

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

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

nui_DepthFrameReady

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

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

実行してみると以下のように表示される。
f:id:astrobot:20110622073432j:image

参照

Camera Fundamentals

Kinect関連記事

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

リンク元