2012年4月17日火曜日

OFでKinectSDK1.0を使用する方法_01

今回はopenCV2.3.1を用いて表示させている

【インクルード関連】
// 追加のインクルードディレクトリ
C:\Program Files\Microsoft SDKs\Kinect\v1.0\inc
C:\opencv\include

// 追加のライブラリディレクトリ
C:\Program Files\Microsoft SDKs\Kinect\v1.0\lib\x86
C:\opencv\lib

// 追加の依存ファイル
Kinect10.lib
opencv_core231.lib
opencv_imgproc231.lib
opencv_highgui231.lib
opencv_objdetect231.lib


【testApp.h】

#pragma once
// Windows Header Files
#include <ole2.h>// ←COM 開発の基本となるヘッダー

// Kinect Header
#include <NuiApi.h> // ←Kinectの機能を使う際に読み込むヘッダー

// OpenCV Header Files
#include <opencv2\opencv.hpp>
// openFrameworks Header Files
#include "ofMain.h"

#define CAMERA_WIDTH 640
#define CAMERA_HEIGHT 480

class testApp : public ofBaseApp{

public:
void setup();
void update();
void draw();

void keyPressed  (int key);
void keyReleased(int key);
void mouseMoved(int x, int y );
void mouseDragged(int x, int y, int button);
void mousePressed(int x, int y, int button);
void mouseReleased(int x, int y, int button);
void windowResized(int w, int h);
void dragEvent(ofDragInfo dragInfo);
void gotMessage(ofMessage msg);
void exit();

INuiSensor *kinect;
};

【testApp.cpp】
bool capFlag = false;
HANDLE cameraEvent;
HANDLE cameraHandle;
std::string windowName;
IplImage *img_camera = 0;


//--------------------------------------------------------------
void testApp::setup()
{
int nCount = 0;
HRESULT hr = S_OK;
hr = NuiGetSensorCount(&nCount);
hr = NuiCreateSensorByIndex(0, &kinect);
//kinectの初期化
hr = kinect->NuiInitialize(NUI_INITIALIZE_FLAG_USES_COLOR);
hr = S_OK;
if(hr!=S_OK){
std::cout << "failed NuiInitialize\n";
while(1){};
exit();
}
cameraEvent = CreateEventW(0, TRUE, FALSE, 0); // ←CreateEvent()のままだと通らないので、直接CreateEventW()を呼び出す必要がある(名前空間の関係か)
hr = kinect->NuiImageStreamOpen(NUI_IMAGE_TYPE_COLOR, NUI_IMAGE_RESOLUTION_640x480,
0, 2, cameraEvent, &cameraHandle);
if(hr!=S_OK){
std::cout << "failed NuiImageStreamOpe\n";
exit();
}

//OpenCVの初期設定
img_camera = cvCreateImage(cvSize(CAMERA_WIDTH, CAMERA_HEIGHT), IPL_DEPTH_8U, 4);
cvNamedWindow("Camera View", CV_WINDOW_AUTOSIZE);


long angle = 0;
kinect->NuiCameraElevationSetAngle(angle);
}

//--------------------------------------------------------------
void testApp::update(){

}

//--------------------------------------------------------------
void testApp::draw(){
HRESULT hr = S_OK;
capFlag = true;
while(capFlag == true){
WaitForSingleObject(cameraEvent, INFINITE);

NUI_IMAGE_FRAME pImageFrame;
hr = kinect->NuiImageStreamGetNextFrame(cameraHandle, 0, &pImageFrame);
if(hr!=S_OK){
std::cout << "failed NuiImageStreamGetNextFrame\n";
exit();
}
INuiFrameTexture *pTexture = pImageFrame.pFrameTexture;
NUI_LOCKED_RECT LockedRect;
pTexture->LockRect(0, &LockedRect, NULL, 0);
BYTE* pBuffer = (BYTE*)LockedRect.pBits;
memcpy(img_camera->imageData, pBuffer, img_camera->imageSize);
cvShowImage("Camera View", img_camera);

kinect->NuiImageStreamReleaseFrame(cameraHandle, &pImageFrame);
int key = cvWaitKey( 10 );
        if ( key == 'q' ) {
            capFlag = false;
}
}
exit();
}
//--------------------------------------------------------------
void testApp::exit()
{
capFlag = false;
kinect->NuiShutdown();
CloseHandle(cameraEvent);

cvReleaseImage(&img_camera);
cvDestroyAllWindows();
}

0 件のコメント:

コメントを投稿