opencv+kinect sdk 开发 深度图和COLOR图 问题

namcer8816 2013-11-17 08:57:30
我想调用多台 KINECT 现在代码不会改了 再现等待。。。。。。


#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);
}

...全文
240 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
namcer8816 2013-11-17
  • 打赏
  • 举报
回复
有人吗 。。。。。。。
namcer8816 2013-11-17
  • 打赏
  • 举报
回复
现在只显示一台 我要调用6个
namcer8816 2013-11-17
  • 打赏
  • 举报
回复
在线等待哦。。。。 高手求助

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧