3,881
社区成员
发帖
与我相关
我的任务
分享
#include <windows.h>
#include <iostream>
#include <NuiApi.h>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
bool tracked[NUI_SKELETON_COUNT]={FALSE};
//CvPoint skeletonPoint[NUI_SKELETON_COUNT][NUI_SKELETON_POSITION_COUNT]={cvPoint(0,0)};
//CvPoint colorPoint[NUI_SKELETON_COUNT][NUI_SKELETON_POSITION_COUNT]={cvPoint(0,0)};
void getColorImage(HANDLE &colorEvent, HANDLE &colorStreamHandle, Mat &colorImage);
void getDepthImage(HANDLE &depthEvent, HANDLE &depthStreamHandle, Mat &depthImage);
//interface
INuiSensor *pNuiSensor;
int main(int argc, char *argv[])
{
Mat colorImage;
colorImage.create(480, 640, CV_8UC3);
Mat depthImage;
depthImage.create(240, 320, CV_8UC3);
HANDLE colorEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
HANDLE depthEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
HANDLE colorStreamHandle = NULL;
HANDLE depthStreamHandle = NULL;
////
HRESULT hr;
int iSensorCount=0;
hr=NuiGetSensorCount(&iSensorCount);
if(FAILED(hr))
{
return hr;
}
for(int i=0;i<iSensorCount;i++)
{
hr=NuiCreateSensorByIndex(i,&pNuiSensor);
if(FAILED(hr))
{
return hr;
}
hr=pNuiSensor->NuiStatus();
if(hr==S_OK){break;}
pNuiSensor->Release();
}
//HRESULT hr = NuiInitialize(NUI_INITIALIZE_FLAG_USES_COLOR | NUI_INITIALIZE_FLAG_USES_DEPTH_AND_PLAYER_INDEX);
hr = NuiInitialize(NUI_INITIALIZE_FLAG_USES_COLOR | NUI_INITIALIZE_FLAG_USES_DEPTH_AND_PLAYER_INDEX);
if( hr != S_OK )
{
cout<<"NuiInitialize failed"<<endl;
return hr;
}
hr = NuiImageStreamOpen(NUI_IMAGE_TYPE_COLOR, NUI_IMAGE_RESOLUTION_640x480, NULL, 4, colorEvent, &colorStreamHandle);
if( hr != S_OK )
{
cout<<"Open the color Stream failed"<<endl;
NuiShutdown();
return hr;
}
hr = NuiImageStreamOpen(NUI_IMAGE_TYPE_DEPTH_AND_PLAYER_INDEX, NUI_IMAGE_RESOLUTION_320x240, NULL, 2, depthEvent, &depthStreamHandle);
if( hr != S_OK )
{
cout<<"Open the depth Stream failed"<<endl;
NuiShutdown();
return hr;
}
namedWindow("colorImage", CV_WINDOW_AUTOSIZE);
namedWindow("depthImage", CV_WINDOW_AUTOSIZE);
while (1)
{
if(WaitForSingleObject(colorEvent, 0)==0)
getColorImage(colorEvent, colorStreamHandle, colorImage);
if(WaitForSingleObject(depthEvent, 0)==0)
getDepthImage(depthEvent, depthStreamHandle, depthImage);
imshow("colorImage", colorImage);
imshow("depthImage", depthImage);
if(cvWaitKey(1)==27)
break;
}
NuiShutdown();
return 0;
}
void getColorImage(HANDLE &colorEvent, HANDLE &colorStreamHandle, Mat &colorImage)
{
const NUI_IMAGE_FRAME *colorFrame = NULL;
NuiImageStreamGetNextFrame(colorStreamHandle, 0, &colorFrame);
INuiFrameTexture *pTexture = colorFrame->pFrameTexture;
NUI_LOCKED_RECT LockedRect;
pTexture->LockRect(0, &LockedRect, NULL, 0);
if( LockedRect.Pitch != 0 )
{
for (int i=0; i<colorImage.rows; i++)
{
uchar *ptr = colorImage.ptr<uchar>(i);
uchar *pBuffer = (uchar*)(LockedRect.pBits) + i * LockedRect.Pitch;
for (int j=0; j<colorImage.cols; j++)
{
ptr[3*j] = pBuffer[4*j];
ptr[3*j+1] = pBuffer[4*j+1];
ptr[3*j+2] = pBuffer[4*j+2];
}
}
}
else
{
cout<<"Get Color Image Failed!"<<endl;
}
pTexture->UnlockRect(0);
NuiImageStreamReleaseFrame(colorStreamHandle, colorFrame );
}
void getDepthImage(HANDLE &depthEvent, HANDLE &depthStreamHandle, Mat &depthImage)
{
const NUI_IMAGE_FRAME *depthFrame = NULL;
NuiImageStreamGetNextFrame(depthStreamHandle, 0, &depthFrame);
INuiFrameTexture *pTexture = depthFrame->pFrameTexture;
NUI_LOCKED_RECT LockedRect;
pTexture->LockRect(0, &LockedRect, NULL, 0);
RGBQUAD q;
if( LockedRect.Pitch != 0 )
{
for (int i=0; i<depthImage.rows; i++)
{
uchar *ptr = depthImage.ptr<uchar>(i);
uchar *pBuffer = (uchar*)(LockedRect.pBits) + i * LockedRect.Pitch;
USHORT *pBufferRun = (USHORT*) pBuffer;
for (int j=0; j<depthImage.cols; j++)
{
int player = pBufferRun[j]&7;
int data = (pBufferRun[j]&0xfff8) >> 3;
uchar imageData = 255-(uchar)(256*data/0x0fff);
q.rgbBlue = q.rgbGreen = q.rgbRed = 0;
switch(player)
{
case 0:
q.rgbRed = imageData / 2;
q.rgbBlue = imageData / 2;
q.rgbGreen = imageData / 2;
break;
case 1:
q.rgbRed = imageData;
break;
case 2:
q.rgbGreen = imageData;
break;
case 3:
q.rgbRed = imageData / 4;
q.rgbGreen = q.rgbRed*4;
q.rgbBlue = q.rgbRed*4;
break;
case 4:
q.rgbBlue = imageData / 4;
q.rgbRed = q.rgbBlue*4;
q.rgbGreen = q.rgbBlue*4;
break;
case 5:
q.rgbGreen = imageData / 4;
q.rgbRed = q.rgbGreen*4;
q.rgbBlue = q.rgbGreen*4;
break;
case 6:
q.rgbRed = imageData / 2;
q.rgbGreen = imageData / 2;
q.rgbBlue = q.rgbGreen*2;
break;
case 7:
q.rgbRed = 255 - ( imageData / 2 );
q.rgbGreen = 255 - ( imageData / 2 );
q.rgbBlue = 255 - ( imageData / 2 );
}
ptr[3*j] = q.rgbBlue;
ptr[3*j+1] = q.rgbGreen;
ptr[3*j+2] = q.rgbRed;
}
}
}
else
{
cout << "Get Depth Image Failed!" << endl;
}
pTexture->UnlockRect(0);
NuiImageStreamReleaseFrame(depthStreamHandle, depthFrame);
}