- Formアプリケーション
- WPFアプリケーション
ラボでは過去の実装ノウハウを活かすこととWPFに関する資料が少なかったことから、現在まで原則前者を使ってきており、Kinect のプログラミングでもそうしてました。しかし、画面描画処理のパフォーマンスをあげるなら、WPFの方が良いということに今更気づいたのと、さすがにWPFを無視することができなくなりましたので、以後、KinectプログラミングについてはWPFに乗り換えることにします。
WritableBitmapを利用するのがポイント
KinectのColorFrameをWPFで表示する際は、
- PictureBoxクラスではなくImageクラスに表示
- BitmapではなくBitmapSourceを割り当てるのが基本
- WritableBitmapを割り当てると表示処理が高速化
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 件のコメント:
コメントを投稿