ブログ@kaorun55

HoloLensやKinectなどのDepthセンサーを中心に書いています。

Kinect for Windows SDK v1.6 の RawBayerデータを使ってみる(C#)

v1.6ではデコード前のカラーカメラのデータが取得できるようになりました。RawBayerというデータで僕は詳細はわかりませんが、検索しているとカメラ関係のがヒットするので、そういうことなんでしょう。

RawBayerデータを取得することで、RGBデータへの変換を自前でCPUなりGPUなりで行うことができるようになります。

とりあえずRawBayerデータで取得して表示してみます。

こちらに詳しい解説が書かれています。

カラーカメラ設定

赤外線と同様にRawBayerデータの取得にはカラーストリームを利用するので、ColorImageStream.Enable()のColorImageFormatとして設定します。RawBayerデータの取得には解像度によって2種類あるので、必要な方を設定します。

  • RawBayerResolution640x480Fps30
  • RawBayerResolution1280x960Fps12

kinect.ColorFrameReady += kinect_ColorFrameReady;

kinect.ColorStream.Enable( ColorImageFormat.RawBayerResolution640x480Fps30 );

kinect.Start();

RawBayerデータの表示

更新されたカラーストリームから、RawBayerデータを取り出し表示します。基本的な流れはRGBデータと同じで、ColorImageFrame.CopyPixelDataTo()でデータを取得し、BitmapSource.Create()で画像化して表示します。ただし、RGBデータは32bitのBGRデータに対して、RawBayerデータは8bitになるので、データ長や、表示のためのフォーマットが変わります。データ長(ColorImageFrame.PixelDataLength)やピクセルあたりのバイト数(ColorImageFrame.BytesPerPixel)はColorImageFrameのデータを使っていれば変更ありません。Bitmapデータのフォーマットのみ「PixelFormats.Gray8」になります。

// RawBayerデータを表示する

using ( ColorImageFrame colorFrame = e.OpenColorImageFrame() ) {

if ( colorFrame != null ) {

// 画像データを取得する

byte[] color = new byte[colorFrame.PixelDataLength];

colorFrame.CopyPixelDataTo( color );

// 画像を表示する(8bitのグレースケール)

imageRawBayer.Source = BitmapSource.Create(

colorFrame.Width, colorFrame.Height,

96, 96, PixelFormats.Gray8, null, color,

colorFrame.Width * colorFrame.BytesPerPixel );

}

}

全体のコードはこちらにあります