Kinect SDK和openCV图像处理抛出未处理的异常错误 [英] Kinect SDK and openCV image processing throwing an unhandled exception error

查看:76
本文介绍了Kinect SDK和openCV图像处理抛出未处理的异常错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好,我非常擅长编程和玩opencv和kinect sdk,并且只是寻求帮助。


我已经通过跟随sdk示例,使用openCv显示kinect的深度流和RGB流,但是现在我似乎无法对深度流进行任何图像处理而不会出现未处理的异常错误。 


到目前为止,这是我的代码:



#include" stdafx.h"


 


// OpenCV目录


#include< cv.h>


#include < cxcore.h>


#include< highgui.h>


 


/ / Kinect SDK目录


#include< MSR_NuiApi.h>


#include< MSR_NuiImageCamera.h>


#include< MSR_NuiSkeleton.h>


 


使用命名空间std;


HRESULT hr = S_OK;


 


//定义变量


#define CHANN EL 3


#define COLOR_WIDTH 640


#define COLOR_HIGHT 480


#define DEPTH_WIDTH 320


#define DEPTH_HIGHT 240


 


BYTE buf [320 * 240 * CHANNEL];


 


//初始化与Kinect传感器的连接 


void InitializeKinect()


{


bool FailToConnect ;


do 


{


  &NBSP; HRESULT hr = NuiInitialize(NUI_INITIALIZE_FLAG_USES_SKELETON | NUI_INITIALIZE_FLAG_USES_DEPTH_AND_PLAYER_INDEX | NUI_INITIALIZE_FLAG_USES_COLOR);



&NBSP; if(FAILED(hr))


  {


system(" cls");


  &NBSP; cout<<" \ n无法连接,是否已插入传感器!? \ n \\ nn; 


FailToConnect = true;


system(" PAUSE");


  &NBSP; // return hr;


  }


 否则


  {


  cout<< "\ nConnection建立!!! \ n \ n";


  FailToConnect = false;


 


  // return hr;


  }


}


  while(FailToConnect);



}


 


//创建RGB图像


int createRGBImage(HANDLE h,IplImage * color)


{


const NUI_IMAGE_FRAME * pImageFrame = NULL;


HRESULT hr = NuiImageStreamGetNextFrame(h,0,& pImageFrame);


 


if(FAILED(hr))


{


cout<< "创建RGB图像失败\ n";


返回-1;


}


 


NuiImageBuffer * pTexture = pImageFrame - > pFrameTexture;


KINECT_LOCKED_RECT LockedRect;


pTexture-> LockRect(0,& LockedRect,NULL,0);


 


if(LockedRect.Pitch!= 0)


{


BYTE * pBuffer =(BYTE *)LockedRect.pBits;


cvSetData(color,pBuffer,LockedRect.Pitch);


}



cvShowImage(" RGB Image",color);


NuiImageStreamReleaseFrame(h,pImageFrame);


返回0;


}


 


//创建深度图像


int createDepthImage(HANDLE h,IplImage * depth)


{


 


const NUI_IMAGE_FRAME * pImageFrame = NULL;


HRESULT hr = NuiImageStreamGetNextFrame(h,0,& pImageFrame);



 


if(FAILED(hr))



cout<< "Create Depth Image Failed\\\
";


// system(" PAUSE");


}



 


NuiImageBuffer * pTexture = pImageFrame - > ; pFrameTexture;


KINECT_LOCKED_RECT LockedRect;


pTexture-> LockRect(0,& LockedRect,NULL,0);


 


if(LockedRect.Pitch!= 0)


{


USHORT * pBuff =(USHORT *)LockedRect.pBits;


for(int i = 0; i<(320 * 240); i ++)


{


BYTE index = pBuff [i]& ; 0x07;


USHORT realDepth =(pBuff [i]& 0xFFF8)>> 3;


BYTE scale = 255 - (BYTE)(256 * realDepth / 0x0fff);



buf [CHANNEL * i] = buf [CHANNEL * i + 1] = buf [CHANNEL * i + 2] = 0;


 


开关(索引)


{


case 0:


buf [CHANNEL * i] = scale / 2 ;


buf [CHANNEL * i + 1] = scale / 2;


buf [CHANNEL * i + 2] = scale / 2;


休息;


 


案例1:


buf [CHANNEL * i] = scale;


休息;


 


案例2:


buf [CHANNEL * i + 1] = scale;


休息;


 


案例3:


buf [CHANNEL * i + 2] =比例;


休息;


 


案例4:


buf [CHANNEL * i] = scale;


buf [CHANNEL * i + 1] = scale;


休息;


 


案例5:


buf [CHANNEL * i] = scale;


buf [CHANNEL * i + 2] = scale;


break;


 


案例6:


buf [CHANNEL * i + 1] = scale;


buf [CHANNEL * i + 2] = scale;


break ;


案例7:


buf [CHANNEL * i] = 255-scale / 2;


buf [ CHANNEL * i + 1] = 255-scale / 2;


buf [CHANNEL * i + 2] = 255 -scale / 2;


break;


}


}



cvSetData(depth,buf, 320 * CHANNEL);


}



&nbs p;


NuiImageStreamReleaseFrame(h,pImageFrame);


 


cvShowImage(" Depth Image",depth);


cvCvtColor(深度,深度,CV_RGB2GRAY);



返回0;


}


 


 


int main(int argc,char * argv [])


{


cout<< "***高级工程主题1 *** \ n";


cout<< "与Kinect sensor建立连接\ n \\ n";


cout<< "在视频流中按'q'取消\ n";



IplImage * color = cvCreateImageHeader(cvSize(640,480),IPL_DEPTH_8U,4);


IplImage * depth = cvCreateImageHeader(cvSize(320,240),IPL_DEPTH_8U,CHANNEL);


 


cvNamedWindow(" RGB Image",CV_WINDOW_AUTOSIZE);


cvNamedWindow(" Depth Image",CV_WINDOW_AUTOSIZE);



 


HRESULT hr = NuiInitialize(NUI_INITIALIZE_FLAG_USES_DEPTH_AND_PLAYER_INDEX | NUI_INITIALIZE_FLAG_USES_COLOR | NUI_INITIALIZE_FLAG_USES_SKELETON);


 


if(hr!= S_OK)


{


cout<<" \\\
NuiInitialize failed\\\
" ;;


cout<<" Kinect是否插入了\ n \ n?" ;;


系统("PAUSE");


return hr;


}



HANDLE m_hNextVideoFrameEvent = CreateEvent(NULL,TRUE,FALSE,NULL);


HANDLE m_pVideoStreamHandle = NULL;


 


hr = NuiImageStreamOpen(NUI_IMAGE_TYPE_COLOR,NUI_IMAGE_RESOLUTION_640x480,0,2,m_hNextVideoFrameEvent,& m_pVideoStreamHandle);


 


if(FAILED(hr))


{


cout<<"无法打开图片流视频"<< endl;


return hr;


}


 


HANDLE m_hNextDepthFrameEvent = CreateEvent(NULL,TRUE,FALSE,NULL );


HANDLE m_pDepthStreamHandle = NULL;



hr = NuiImageStreamOpen(NUI_IMAGE_TYPE_DEPTH_AND_PLAYER_INDEX,NUI_IMAGE_RESOLUTION_320x240,0,2, m_hNextDepthFrameEvent,& m_pDepthStreamHandle);


 


if(FAILED (hr))


{


cout<<""无法打开深度流视频"<< endl;


return hr;


}



while(1)


{


WaitForSingleObject (m_hNextVideoFrameEvent,INFINITE);


createRGBImage(m_pVideoStreamHandle,color);



WaitForSingleObject(m_hNextDepthFrameEvent,INFINITE) ;


createDepthImage(m_pDepthStreamHandle,depth);



//退出


 


int c = cvWaitKey(1);


if(c == 27 || c =='q'|| c =='Q')


break;


}




cvReleaseImageHeader(& depth );


cvReleaseImageHeader(& color);



cvDestroyWindow(" Depth image");


cvDestroyWindow(" RGB image");


 


NuiShutdown();


返回0;


}



 


我不断获取状态的错误 


AdvancedTopic1.exe中0x75acb9bc处的未处理异常:Microsoft C ++异常:cv ::内存位置0x002bf41c的异常..


感谢高级中的任何帮助

解决方案

崩溃时看到的控制台/调试输出是什么,以及为您触发异常的特定代码行是什么?我们也不是OpenCV专家,所以我们感谢您在您身边做一些调试,所以我们可以
帮助您更好。


Eddy


Hi all, im very new to programing and playing around with both opencv and the kinect sdk and was just looking for alittle help.

I have managed, by following the sdk examples, display the depth stream and RGB stream of the kinect using openCv, however now i cant seem to do any image processing on the depth stream with out getting an Unhandled exception error. 

Any way this is my code so far:

#include "stdafx.h"

 

//OpenCV Directories

#include <cv.h>

#include <cxcore.h>

#include <highgui.h>

 

//Kinect SDK Directories

#include <MSR_NuiApi.h>

#include <MSR_NuiImageCamera.h>

#include <MSR_NuiSkeleton.h>

 

using namespace std;

HRESULT hr = S_OK;

 

//Define Variables

#define CHANNEL 3

#define COLOR_WIDTH 640

#define COLOR_HIGHT 480

#define DEPTH_WIDTH 320

#define DEPTH_HIGHT 240

 

BYTE buf[320*240*CHANNEL];

 

//Initialize connection with Kinect sensor 

void InitializeKinect()

{

bool FailToConnect;

do 

{

    HRESULT hr = NuiInitialize( NUI_INITIALIZE_FLAG_USES_SKELETON |NUI_INITIALIZE_FLAG_USES_DEPTH_AND_PLAYER_INDEX | NUI_INITIALIZE_FLAG_USES_COLOR);

  if( FAILED( hr ) )

  {

system("cls");

    cout <<"\nFailed to connect, is the sensor plugged in!? \n\n";

FailToConnect = true;

system("PAUSE");

    //return hr;

  }

  else

  {

  cout << "\nConnection Established !!! \n \n ";

  FailToConnect = false;

 

  //return hr;

  }

}

  while ( FailToConnect);

}

 

//Create RGB Image

int createRGBImage(HANDLE h, IplImage*colour)

{

const NUI_IMAGE_FRAME * pImageFrame = NULL;

HRESULT hr = NuiImageStreamGetNextFrame(h, 0, &pImageFrame);

 

if (FAILED (hr))

{

cout << "Create RGB Image Failed\n";

return -1;

}

 

NuiImageBuffer * pTexture = pImageFrame -> pFrameTexture;

KINECT_LOCKED_RECT LockedRect;

pTexture->LockRect(0, &LockedRect, NULL, 0);

 

if (LockedRect.Pitch !=0)

{

BYTE * pBuffer = (BYTE*) LockedRect.pBits;

cvSetData(colour, pBuffer, LockedRect.Pitch);

}

cvShowImage("RGB Image", colour);

NuiImageStreamReleaseFrame(h, pImageFrame);

return 0;

}

 

//Create Depth Image

int createDepthImage(HANDLE h, IplImage* depth)

{

 

const NUI_IMAGE_FRAME * pImageFrame = NULL;

HRESULT hr = NuiImageStreamGetNextFrame(h, 0, &pImageFrame);

 

if (FAILED (hr))

cout << "Create Depth Image Failed\n";

//system ("PAUSE");

}

 

NuiImageBuffer * pTexture = pImageFrame ->pFrameTexture;

KINECT_LOCKED_RECT LockedRect;

pTexture->LockRect (0, &LockedRect, NULL, 0);

 

if (LockedRect.Pitch != 0)

{

USHORT * pBuff = (USHORT*) LockedRect.pBits;

for(int i=0; i<(320*240); i++)

{

BYTE index = pBuff[i]&0x07;

USHORT realDepth = (pBuff[i]&0xFFF8)>>3;

BYTE scale = 255 - (BYTE)(256*realDepth/0x0fff);

buf[CHANNEL*i] = buf[CHANNEL*i+1] =buf[CHANNEL *i+2] =0;

 

switch(index)

{

case 0:

buf[CHANNEL*i] = scale/2;

buf[CHANNEL*i+1] = scale/2;

buf[CHANNEL*i+2]=scale/2;

break;

 

case 1:

buf[CHANNEL*i]=scale;

break;

 

case 2:

buf[CHANNEL*i+1]=scale;

break;

 

case 3:

buf[CHANNEL*i+2]=scale;

break;

 

case 4:

buf[CHANNEL*i]=scale;

buf[CHANNEL*i+1]=scale;

break;

 

case 5:

buf[CHANNEL*i]=scale;

buf[CHANNEL*i+2]=scale;

break;

 

case 6:

buf[CHANNEL*i+1]=scale;

buf[CHANNEL*i+2]=scale;

break;

case 7:

buf[CHANNEL*i]=255-scale/2;

buf[CHANNEL*i+1]=255-scale/2;

buf[CHANNEL*i+2]=255-scale/2;

break;

}

}

cvSetData(depth, buf, 320*CHANNEL);

}

 

NuiImageStreamReleaseFrame(h, pImageFrame);

 

cvShowImage("Depth Image",depth);

cvCvtColor(depth, depth, CV_RGB2GRAY);

return 0;

}

 

 

int main(int argc,char * argv[])

{

cout << "***Advanced Engineering Topic 1***\n";

cout << "Establishing connection with Kinect sensor\n\n";

cout << "Press 'q' during video stream to cancel\n";

IplImage* color = cvCreateImageHeader(cvSize(640,480),IPL_DEPTH_8U,4);

IplImage* depth = cvCreateImageHeader(cvSize(320,240),IPL_DEPTH_8U,CHANNEL);

 

cvNamedWindow("RGB Image",CV_WINDOW_AUTOSIZE);

cvNamedWindow("Depth Image",CV_WINDOW_AUTOSIZE);

 

HRESULT hr = NuiInitialize(NUI_INITIALIZE_FLAG_USES_DEPTH_AND_PLAYER_INDEX|NUI_INITIALIZE_FLAG_USES_COLOR|NUI_INITIALIZE_FLAG_USES_SKELETON);

 

if( hr != S_OK )

{

cout<<"\nNuiInitialize failed\n";

cout<<"Is the Kinect pluged in\n\n?";

system ("PAUSE");

return hr;

}

HANDLE m_hNextVideoFrameEvent = CreateEvent( NULL, TRUE, FALSE, NULL );

HANDLE m_pVideoStreamHandle = NULL;

 

hr = NuiImageStreamOpen(NUI_IMAGE_TYPE_COLOR,NUI_IMAGE_RESOLUTION_640x480, 0, 2, m_hNextVideoFrameEvent, &m_pVideoStreamHandle);

 

if( FAILED( hr ) )

{

cout<<"Could not open image stream video"<<endl;

return hr;

}

 

HANDLE m_hNextDepthFrameEvent = CreateEvent( NULL, TRUE, FALSE, NULL );

HANDLE m_pDepthStreamHandle = NULL;

hr = NuiImageStreamOpen( NUI_IMAGE_TYPE_DEPTH_AND_PLAYER_INDEX, NUI_IMAGE_RESOLUTION_320x240, 0, 2, m_hNextDepthFrameEvent, &m_pDepthStreamHandle);

 

if( FAILED( hr ) )

{

cout<<"Could not open depth stream video"<<endl;

return hr;

}

while(1)

{

WaitForSingleObject(m_hNextVideoFrameEvent,INFINITE);

createRGBImage(m_pVideoStreamHandle,color);

WaitForSingleObject(m_hNextDepthFrameEvent,INFINITE);

createDepthImage(m_pDepthStreamHandle,depth);

//exit

 

int c = cvWaitKey(1);

if( c == 27 || c == 'q' || c == 'Q' )

break;

}

cvReleaseImageHeader(&depth);

cvReleaseImageHeader(&color);

cvDestroyWindow("Depth image");

cvDestroyWindow("RGB image");

 

NuiShutdown();

return 0;

}

 

The error i keep getting states 

Unhandled exception at 0x75acb9bc in AdvancedTopic1.exe: Microsoft C++ exception: cv::Exception at memory location 0x002bf41c..

Thanks for any help in advanced

解决方案

What is the console/debug output that you see when it crashes, and what is the specific line of code that triggers an exception for you? We're not OpenCV experts either, so we appreciate you doing a little bit of debugging on your side as well so we can help you better.

Eddy


这篇关于Kinect SDK和openCV图像处理抛出未处理的异常错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆