2014-05-14

Kinectプログラミングをする時は、WPFプロジェクト がお勧めです

Windowsプログラミング(.NETフレームワーク)において、GUIアプリの開発アプローチとしては、歴史的に
  • Formアプリケーション
  • WPFアプリケーション
の2つに分けられます。前者は従来のWindowsGUIプログラムの流れです。後者はVista以降に標準搭載された.NETフレームワーク3.0に最適化されたもので、GUI定義がXAMLと呼ばれるXMLで書かれたファイルで表現されるだけでなく、2Dや3Dを含めた各種GUI処理を統一的に扱えるフレームワークを持つという特徴があります。

ラボでは過去の実装ノウハウを活かすこととWPFに関する資料が少なかったことから、現在まで原則前者を使ってきており、Kinect のプログラミングでもそうしてました。しかし、画面描画処理のパフォーマンスをあげるなら、WPFの方が良いということに今更気づいたのと、さすがにWPFを無視することができなくなりましたので、以後、KinectプログラミングについてはWPFに乗り換えることにします。

WritableBitmapを利用するのがポイント
KinectのColorFrameをWPFで表示する際は、
  • PictureBoxクラスではなくImageクラスに表示
  • BitmapではなくBitmapSourceを割り当てるのが基本
  • WritableBitmapを割り当てると表示処理が高速化
という点が変わります。ポイントは3つめです。下記のサンプルを見てもらえばわかりますが、WritableBitmapを作成しImageクラスのSourceに1度だけ割り当てるだけで、あとはWritableBitmapの内容を更新するだけで更新されます。Formでは各フレーム画像ごとに毎回Bitmap変換して貼り付けていましたから、プログラムのスッキリしますし速度の向上も期待できます。

Int32Rect colorImageBitmapRect = new Int32Rect(0, 0, kinect.ColorStream.FrameWidth, kinect.ColorStream.FrameHeight);
int colorImageStride = kinect.ColorStream.FrameWidth * kinect.ColorStream.FrameBytesPerPixel;
WriteableBitmap wBitmap = new WriteableBitmap(kinect.ColorStream.FrameWidth, kinect.ColorStream.FrameHeight, 96, 96, PixelFormats.Bgr32, null);
//imageクラス(WPF)の描画ソースをWritableBitmapに指定しておく(1度だけでよい)
image1.Source = WBitmap;
// --以下は~FrameReadyでの処理 ---
//ColorFrameの取得
using (ColorImageFrame colorFrame = args.OpenColorImageFrame()){
if (colorFrame != null) {
byte[] pixelData = new byte[colorFrame.PixelDataLength];
colorFrame.CopyPixelDataTo(pixelData);
//ここでWritableBitmapを書き換えるだけで、image1の描画は更新される
this.wBitmap.WritePixels(this.colorImageBitmapRect, pixelData, this.colorImageStride, 0);
}
}


0 件のコメント:

コメントを投稿