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

Natural Software

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

Kinect for Windows SDK v1.6 の カラーカメラの設定を使ってみる(C++)

Kinect for Windows SDK v1.6入門

C++でカラーカメラの設定を変更してみます。数が多いので、自動露出と自動ホワイトバランスの切り替えのみとします(上の画像で、左が自動ホワイトバランスOFF、右が自動ホワイトバランスONです)。

カラーカメラの設定は INuiColorCameraSettings  を利用します。このインタフェースで何ができるかはこちら( http://msdn.microsoft.com/en-us/library/nuisensor.inuicolorcamerasettings.aspx )を参照してください。

INuiColorCameraSettings  のインスタンスはINuiSensor::NuiGetColorCameraSettings() で取得します。インスタンスを取得した後、各種設定をいじることができます。

ここでは'h'キーで自動ホワイトバランスのON/OFF、'e'キーで自動露出のON/OFFを切り替えるようにしています。

#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,

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

DWORD width = 0;

DWORD height = 0;

::NuiImageResolutionToSize( NUI_IMAGE_RESOLUTION_640x480, width, height );

// カメラ設定のインタフェースを取得する

INuiColorCameraSettings *cameraSettings = 0;

kinect->NuiGetColorCameraSettings( &cameraSettings );

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_8UC4, rect.pBits );

cv::imshow( "05-ColorCameraSettingsCpp", camera );

kinect->NuiImageStreamReleaseFrame( imageHandle, &imageFrame );

int key = cv::waitKey( 10 );

if ( key == 'q' ) {

break;

}

// 自動ホワイトバランスのON/OFF

else if ( key == 'h' ) {

BOOL isAutoWhiteBalance = FALSE;

cameraSettings->GetAutoWhiteBalance( &isAutoWhiteBalance );

cameraSettings->SetAutoWhiteBalance( !isAutoWhiteBalance );

}

// 自動露出のON/OFF

else if ( key == 'e' ) {

BOOL isAutoExposure = FALSE;

cameraSettings->GetAutoExposure( &isAutoExposure );

cameraSettings->SetAutoExposure( !isAutoExposure );

}

}

}

catch ( std::exception& ex ) {

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

}

}

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