ブログ@kaorun55

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

Kinect for Windows SDK v1.6 の RawBayerと赤外線画像を表示してみる(C++)

C++でRawBayerと赤外線画像を表示してみます。基本的には両者とも同じで、カラーカメラのフォーマットとピクセルフォーマットが異なるのみです。

赤外線画像の表示

INuiSensor::NuiInitialize()ではカラーストリームを利用するように設定( NUI_INITIALIZE_FLAG_USES_COLOR  )し、INuiSensor::NuiImageStreamOpen()で赤外線画像をあらわす NUI_IMAGE_TYPE_COLOR_INFRARED を設定します。

赤外線の画像は16bitのグレースケールになっているので、cv::MatへはCV_16Uで渡します。

#include <Windows.h>

#include <NuiApi.h>

#include <iostream>

#include <conio.h>

#include <opencv2\opencv.hpp>

void main()

{

try {

int count = 0;

::NuiGetSensorCount( &count );

if ( count == 0 ) {

throw std::runtime_error( "利用可能なKinectがありません" );

}

INuiSensor* kinect;

::NuiCreateSensorByIndex( 0, & kinect );

kinect->NuiInitialize( NUI_INITIALIZE_FLAG_USES_COLOR );

HANDLE imageHandle;

kinect->NuiImageStreamOpen( NUI_IMAGE_TYPE_COLOR_INFRARED,

NUI_IMAGE_RESOLUTION_640x480, 0, 2, 0, &imageHandle );

DWORD width = 0;

DWORD height = 0;

::NuiImageResolutionToSize( NUI_IMAGE_RESOLUTION_640x480, width, height );

while ( true ) {

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

NUI_IMAGE_FRAME imageFrame = { 0 };

kinect->NuiImageStreamGetNextFrame(imageHandle, INFINITE, &imageFrame);

NUI_LOCKED_RECT rect = { 0 };

imageFrame.pFrameTexture->LockRect( 0, &rect, 0, 0 );

// 表示する

cv::Mat camera( height, width, CV_16U, rect.pBits );

cv::imshow( "03-InfraredCpp", camera );

kinect->NuiImageStreamReleaseFrame( imageHandle, &imageFrame );

int key = cv::waitKey( 10 );

if ( key == 'q' ) {

break;

}

}

}

catch ( std::exception& ex ) {

std::cout << ex.what() << std::endl;

}

}

赤外線エミッタのON/OFFの取得は INuiSensor::NuiGetForceInfraredEmitterOff  、切り替えは INuiSensor::NuiSetForceInfraredEmitterOff で行いますが、切り替えの設定( INuiSensor::NuiSetForceInfraredEmitterOff ) を利用する際は、INuiSensor::NuiInitialize() に NUI_INITIALIZE_FLAG_USES_DEPTH の設定が必要になります。

RawBayerデータの表示

INuiSensor::NuiInitialize()ではカラーストリームを利用するように設定( NUI_INITIALIZE_FLAG_USES_COLOR  )し、INuiSensor::NuiImageStreamOpen()でRawBayerデータをあらわす NUI_IMAGE_TYPE_COLOR_RAW_BAYER を設定します。

赤外線の画像は8bitのグレースケールになっているので、cv::MatへはCV_8Uで渡します。

#include <Windows.h>

#include <NuiApi.h>

#include <iostream>

#include <conio.h>

#include <opencv2\opencv.hpp>

void main()

{

try {

int count = 0;

::NuiGetSensorCount( &count );

if ( count == 0 ) {

throw std::runtime_error( "利用可能なKinectがありません" );

}

INuiSensor* kinect;

::NuiCreateSensorByIndex( 0, & kinect );

kinect->NuiInitialize( NUI_INITIALIZE_FLAG_USES_COLOR );

HANDLE imageHandle;

kinect->NuiImageStreamOpen( NUI_IMAGE_TYPE_COLOR_RAW_BAYER,

NUI_IMAGE_RESOLUTION_640x480, 0, 2, 0, &imageHandle );

DWORD width = 0;

DWORD height = 0;

::NuiImageResolutionToSize( NUI_IMAGE_RESOLUTION_640x480, width, height );

while ( true ) {

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

NUI_IMAGE_FRAME imageFrame = { 0 };

kinect->NuiImageStreamGetNextFrame(imageHandle, INFINITE, &imageFrame);

NUI_LOCKED_RECT rect = { 0 };

imageFrame.pFrameTexture->LockRect( 0, &rect, 0, 0 );

// 表示する

cv::Mat camera( height, width, CV_8U, rect.pBits );

cv::imshow( "04-RawBayerCpp", camera );

kinect->NuiImageStreamReleaseFrame( imageHandle, &imageFrame );

int key = cv::waitKey( 10 );

if ( key == 'q' ) {

break;

}

}

}

catch ( std::exception& ex ) {

std::cout << ex.what() << std::endl;

}

}

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