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;
}
}
全体のコードはこちらにあります