読者です 読者をやめる 読者になる 読者になる

Natural Software

KinectなどのDepthセンサーを中心に活動しています

Kinect for Windows SDK v1.6 の 赤外線いろいろを使ってみる(C#)

Kinect for Windows SDK v1.6入門

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にすると、赤外線画像も、距離データも取得できなくなるため、画面は真っ黒になります。

また、カラー画像と距離画像を重ねてみると、奇麗に重なります。両方とも距離カメラのデータを使ってるので、意図した結果ですが、念のため。

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