问候,
我正在使用 Kinect 360 在 C++ 中开发一个应用程序。我在运行时遇到了 KinectGrabber 的问题,它没有像我希望的那样在运行时初始化相机。在调试它时,我发现它在测试“hr”的值时出现“MSFTKinectGrabber::Init”错误。这个测试尽职尽责地中断了程序,但我不知道为什么。
我的设置:
- 我已经安装了 Kinect v1.8 SDK,然后是 v1.8 Development Kit,最后是 v1.8 Runtime。
- 编译器是VStudio 2010;
- 这个应用程序是由我的一位同事开发的,之前在另一台计算机上运行过(笔记本电脑 - windows 8);
- 我正在使用新桌面(Windows 10);
- 尝试了多个 USB 条目(2.0 和 3.0),Kinect 正在“Developer Toolkit Browser v1.8.0(kinect for Windows)的演示中工作;
- 在设备管理器中检查 Kinect 的驱动程序并更新它们(无论哪种方式,Kinect 运行时都会添加额外的驱动程序功能并更新它们);
当程序进入 IF 语句 (@"MSFTKinectGrabber::Init") 时,这似乎是一切都出错的地方:
hr = m_NuiSensor->NuiImageStreamOpen(NUI_IMAGE_TYPE_DEPTH, NUI_IMAGE_RESOLUTION_640x480,
depthFlags, 2, m_NextDepthFrameEvent, &m_pDepthStreamHandle);
if( FAILED( hr ) )
{
std::cout << "Error: NuiImageStreamOpen " << hr << std::endl;
return false;
}
下面我有关于:
- 我的main,而不是我认为的问题的核心,只是为了展示我如何启动程序;
- 我的函数“ initializeKinect ”,如果“MSFTKinectGrabber::Init”返回 true,则 if(!grabberMSFT.Init(&processor)) 语句应该为 false,这意味着没有问题;
- 函数“ MSFTKinectGrabber::Init ”,用于 Kinect 的初始化和测试。
功能:主要
int main(int argc, char** argv){
processor = new KinectDataProcessor();
MSFTKinectGrabber grabberMSFT;
int kinect_state = initializeKinect(*processor, grabberMSFT, argc, argv);
if(kinect_state==0){
cloudProcessor = new CloudProcessor();
int v=0;
while (run){
v++;
HandleKeyboardEvents();
processor->Update();
if (startClassify && !continueClassify){
continueClassify = true;
boost::thread classificationThread(&threadClassify);
}
}
grabberMSFT.DeInit();
processor->DeInit();
}else{
system("PAUSE");
return -1;
}
return 0;
}
功能:初始化Kinect
int initializeKinect(KinectDataProcessor & processor, MSFTKinectGrabber & grabberMSFT, int argc,char** argv){
int nRetCode = 0;
if (hModule != NULL)
{
// initialize MFC and print and error on failure
if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
_tprintf(_T("Fatal Error: MFC initialization failed\n"));
nRetCode = 1;
}
else
{
std::cout << "Kinect Parameters: " << std::endl;
std::cout << "1 - MinDepth (float) - minimum allowed is '0.0f'" << std::endl;
std::cout << "2 - MaxDepth (float) - maximum allowed is '4.0f'" << std::endl;
std::cout << "3 - NearMode (int) - '0' for true, '1' for false" << std::endl;
float minDepth = MIN_DEPTH;//float (atof(argv[1]));
float maxDepth = MAX_DEPTH;//float (atof(argv[2]));
std::cout << "[MinDepth, MaxDepth] = [" << minDepth << ", " << maxDepth << "]" << std::endl;
bool nearModeActive = true;
std::cout << "Near mode selected\n";
//KinectDataProcessor processor;
if(!processor.Init(KinectProcessor::GrabberType::MSFT))
{
processor.DeInit();
run = false;
return -1;
}
processor.SetDepthParameters(minDepth, maxDepth, nearModeActive);
//MSFTKinectGrabber grabberMSFT;
if (!grabberMSFT.Init(&processor)){
grabberMSFT.DeInit();
processor.DeInit();
run = false;
return -1;
}
cout<<"Ready to run"<<endl;
}
}
else
{
// TODO: change error code to suit your needs
_tprintf(_T("Fatal Error: GetModuleHandle failed\n"));
nRetCode = 1;
}
return nRetCode;
}
功能:MSFTKinectGrabber::Init
bool MSFTKinectGrabber::Init(KinectProcessor * kinectProcessor)
{
m_KinectProcessor = kinectProcessor;
//get NuiSensor obj
HRESULT hr = NuiCreateSensorByIndex(0, &m_NuiSensor);
if ( FAILED(hr) )
{
std::cout << "Error: NuiCreateSensorByIndex " << hr << std::endl;
return false;
}
m_DeviceID = m_NuiSensor->NuiDeviceConnectionId();
hr = m_NuiSensor->NuiInitialize( NUI_INITIALIZE_FLAG_USES_COLOR | NUI_INITIALIZE_FLAG_USES_DEPTH );
if( FAILED(hr) )
{
std::cout << "Error: NuiInitialize " << hr << std::endl;
return false;
}
//Create color and depth events
m_NextColorFrameEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
m_NextDepthFrameEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
//open video streams
hr = m_NuiSensor->NuiImageStreamOpen(NUI_IMAGE_TYPE_COLOR, NUI_IMAGE_RESOLUTION_640x480, 0, 2, m_NextColorFrameEvent, &m_pColorStreamHandle);
if( FAILED( hr ) )
{
std::cout << "Error: NuiImageStreamOpen " << hr << std::endl;
return false;
}
DWORD depthFlags = NULL;
if(kinectProcessor->IsMSFTNearMode())
depthFlags = NUI_IMAGE_STREAM_FLAG_ENABLE_NEAR_MODE;
hr = m_NuiSensor->NuiImageStreamOpen(NUI_IMAGE_TYPE_DEPTH, NUI_IMAGE_RESOLUTION_640x480, depthFlags, 2, m_NextDepthFrameEvent, &m_pDepthStreamHandle);
if( FAILED( hr ) )
{
std::cout << "Error: NuiImageStreamOpen " << hr << std::endl;
return false;
}
// Start the NUI processing thread
m_ProcessThreadStopEvent = CreateEvent( NULL, FALSE, FALSE, NULL );
m_ProcessThread = CreateThread( NULL, 0, ProcessThread, this, 0, NULL );
return true;
}
感谢您的时间!