ブログ@kaorun55

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

Kinect for Windows SDK v1.6 で拡張された距離データを取得する(C++)

ちょっと工夫が必要です。手順としては次のようになっています。

  • INuiSensor::NuiImageStreamGetNextFrame() で NUI_IMAGE_FRAME を取得する
  • それをもとにINuiSensor::NuiImageFrameGetDepthImagePixelFrameTexture() で INuiFrameTexture を取得する。なお、このメソッドの呼び出しは INuiSensor::NuiImageStreamReleaseFrame() の前に行うこと。
  • 取得した INuiFrameTexture の INuiFrameTexture::LockRect() で NUI_LOCKED_RECT を取得する。
  • 取得した NUI_LOCKED_RECT のpBits メンバが NUI_DEPTH_IMAGE_PIXEL 構造体のデータ列へのポインタになっていますのでキャストする。

    • NUI_DEPTH_IMAGE_PIXEL* depthPixel = (NUI_DEPTH_IMAGE_PIXEL*)rect.pBits;

  •  NUI_DEPTH_IMAGE_PIXEL 構造体は playerIndex と depth を持っているので、それを使って処理する。
  • 最後に INuiSensor::NuiImageStreamReleaseFrame() でフレームデータを解放する。

// 距離カメラのフレームデータを取り出す

NUI_IMAGE_FRAME depthFrame = { 0 };

kinect->NuiImageStreamGetNextFrame( depthHandle, INFINITE, &depthFrame );

// フレームデータを元に、拡張距離データを取得する

BOOL nearMode = FALSE;

INuiFrameTexture *frameTexture = 0;

kinect->NuiImageFrameGetDepthImagePixelFrameTexture(

depthHandle, &depthFrame, &nearMode, &frameTexture );

// NUI_DEPTH_IMAGE_PIXELを取り出す

NUI_LOCKED_RECT rect = { 0 };

frameTexture->LockRect( 0, &rect, 0, 0 );

//typedef struct _NUI_DEPTH_IMAGE_PIXEL

//{

// USHORT playerIndex;

// USHORT depth;

//} NUI_DEPTH_IMAGE_PIXEL;

NUI_DEPTH_IMAGE_PIXEL* depthPixel = (NUI_DEPTH_IMAGE_PIXEL*)rect.pBits;

// 何かする

kinect->NuiImageStreamReleaseFrame( depthHandle, &depthFrame );

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