v1.6で利用可能になった、赤外線画像と、赤外線エミッタのON/OFF切り替えを行ってみます。赤外線画像はカラーストリームのデータとして取得できる16bitグレースケールのデータになります。カラーストリームを利用するため、カラーカメラのデータと赤外線データは排他になるようです。
赤外線画像のためのカラーカメラ設定
繰り返しになりますが、赤外線の画像はカラーストリームを利用するので、これを取得したい場合にはColorImageStream.Enable()のColorImageFormatとして設定します。ColorImageFormatは今回の更新で次の項目が追加されています。それぞれ赤外線画像と、生のカラーデータです。ここでは赤外線画像を取得するため、InfraredResolution640x480Fps30を設定します。
- InfraredResolution640x480Fps30
- RawBayerResolution640x480Fps30
- RawBayerResolution1280x960Fps12
kinect.AllFramesReady += kinect_AllFramesReady;kinect.ColorStream.Enable( ColorImageFormat.InfraredResolution640x480Fps30 );
kinect.DepthStream.Enable( DepthImageFormat.Resolution640x480Fps30 );
kinect.Start();
赤外線画像の表示
更新されたカラーストリームから、赤外線画像を取り出し表示します。基本的な流れはRGBデータと同じで、ColorImageFrame.CopyPixelDataTo()でデータを取得し、BitmapSource.Create()で画像化して表示します。ただし、RGBデータは32bitのBGRデータに対して、赤外線画像データは16bitのグレースケールになるので、データ長や、表示のためのフォーマットが変わります。データ長(ColorImageFrame.PixelDataLength)やピクセルあたりのバイト数(ColorImageFrame.BytesPerPixel)はColorImageFrameのデータを使っていれば変更ありません。Bitmapデータのフォーマットのみ「PixelFormats.Gray16」になります。
// 赤外線画像を表示するusing ( ColorImageFrame colorFrame = e.OpenColorImageFrame() ) {
if ( colorFrame != null ) {
// 赤外線画像データを取得する
byte[] color = new byte[colorFrame.PixelDataLength];
colorFrame.CopyPixelDataTo( color );
// 赤外線画像を表示する(16bitのグレースケール)
imageInfrared.Source = BitmapSource.Create(
colorFrame.Width, colorFrame.Height,
96, 96, PixelFormats.Gray16, null, color,
colorFrame.Width * colorFrame.BytesPerPixel );
}
}
赤外線エミッタのON/OFFを切り替える
赤外線のON/OFFを切り替えます。この設定はKinectSensor.ForceInfraredEmitterOffにありますので、チェックボックスによって切り替わるようにします。なお、KinectSensor.ForceInfraredEmitterOffはtrueでOFF,falseでONになっているので注意してください。
private void CheckBox_Checked_1( object sender, RoutedEventArgs e ){
kinect.ForceInfraredEmitterOff = !(bool)checkInfrared.IsChecked;
}
赤外線をOFFにすると、赤外線画像も、距離データも取得できなくなるため、画面は真っ黒になります。
また、カラー画像と距離画像を重ねてみると、奇麗に重なります。両方とも距離カメラのデータを使ってるので、意図した結果ですが、念のため。
全体のコードはこちらにあります