Kinect for Windows SDK 入門3:カメラ基礎
Kinect入門
- Kinect for Windows SDK 入門1: Kinectセンサーのインストール
- Kinect for Windows SDK 入門2 開発環境のセットアップ
- Kinect for Windows SDK 入門3:カメラ基礎
- 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内に以下のように並べる
ランタイムの初期化
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つを含む
- イメージのメタデータ。
- ImageType(それが深度イメージなのか、カラーイメージなのか)や、イメージのサイズを知るための解像度など
- イメージ
- 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();