C++ 代码:查找 Kinect 传感器时出现逻辑错误
C++ code: Logical error in finding the Kinect sensor
我想在 Viual Studio 2013 中通过 Windows SDK 2.0 从 Kinect V2 获取深度和 RGB 数据。所以我写了这些代码:
#include <Kinect.h>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <Windows.h>
#include <iostream>
using namespace std;
const int width = 512;
const int height = 424;
const int colorwidth = 1920;
const int colorheight = 1080;
// Kinect Variables
IKinectSensor* sensor; // Kinect sensor
IMultiSourceFrameReader* reader; // Kinect data source
ICoordinateMapper* mapper;
int main(int argc, char* argv[]) {
if (FAILED(GetDefaultKinectSensor(&sensor))) {
printf("not found sensor");
getchar();
return -100;
}
if (sensor) {
sensor->get_CoordinateMapper(&mapper);
sensor->Open();
sensor->OpenMultiSourceFrameReader(
FrameSourceTypes::FrameSourceTypes_Depth | FrameSourceTypes::FrameSourceTypes_Color,
&reader);
IMultiSourceFrame* framesource;
cout << "Find!!!";
getchar();
return 100;
}
else {
return -100;
}
getchar();
return 10;
}
逻辑上,当我没有将 Kinect 传感器插入我的笔记本电脑时,控制台中应该打印:"not found sensor",不是吗?但是,在控制台打印:"Find!!!"。有什么问题?
不,从 SDK v2 开始,您可以使用 KinectStudio 调试应用程序,即使没有物理 kinect 连接到系统。如果要检查是否连接了实际的Kinect,则需要使用传感器本身的IsAvailable
属性。 GetDefaultKinectSensor
将始终为您提供 S_OK
,除非您遇到运行时或安装问题。 GetDefaultKinectSensor
不会检查这个流是来自实际的物理 kinect 传感器还是来自 KinectStudio。
以下是我项目中的代码片段。如果你想要更多关于 Kinect 的例子,请参考我在 github https://github.com/shanilfernando/VRInteraction 中的项目或在这里评论。我非常乐意为您提供帮助。
HRESULT CDepthBasics::InitializeDefaultSensor()
{
HRESULT hr;
hr = GetDefaultKinectSensor(&m_pKinectSensor);
if (FAILED(hr))
{
return hr;
}
if (m_pKinectSensor)
{
if (SUCCEEDED(hr))
{
hr = m_pKinectSensor->get_CoordinateMapper(&m_pCoordinateMapper);
}
if (SUCCEEDED(hr))
{
hr = m_pKinectSensor->Open();
}
if (SUCCEEDED(hr))
{
hr = m_pKinectSensor->OpenMultiSourceFrameReader(
FrameSourceTypes::FrameSourceTypes_Depth | FrameSourceTypes::FrameSourceTypes_Color | FrameSourceTypes::FrameSourceTypes_Body | FrameSourceTypes::FrameSourceTypes_BodyIndex,
&m_pMultiSourceFrameReader);
}
}
if (!m_pKinectSensor || FAILED(hr))
{
std::cout << "No ready Kinect found!" << std::endl;
return E_FAIL;
}
else
{
std::cout << "Kinect found!" << std::endl;
}
return hr;
}
https://github.com/shanilfernando/VRInteraction/blob/master/DepthBasics.cpp
编辑
我没有使用 IsAvailable
,因为对我来说,流的来源并不重要。有时我使用 KinectStudio 来获取流,而 Kinect 不在身边。我说过 GetDefaultKinectSensor
会 return S_OK
除非你有运行时或安装问题,我没有说 GetDefaultKinectSensor
总是会给你一个有效的 m_pKinectSensor
。由于我们无法访问 GetDefaultKinectSensor
的实现,作为一个好的做法,最好在使用它之前检查它是否 null
。 This is the official answer for your question from the Microsoft
我想在 Viual Studio 2013 中通过 Windows SDK 2.0 从 Kinect V2 获取深度和 RGB 数据。所以我写了这些代码:
#include <Kinect.h>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <Windows.h>
#include <iostream>
using namespace std;
const int width = 512;
const int height = 424;
const int colorwidth = 1920;
const int colorheight = 1080;
// Kinect Variables
IKinectSensor* sensor; // Kinect sensor
IMultiSourceFrameReader* reader; // Kinect data source
ICoordinateMapper* mapper;
int main(int argc, char* argv[]) {
if (FAILED(GetDefaultKinectSensor(&sensor))) {
printf("not found sensor");
getchar();
return -100;
}
if (sensor) {
sensor->get_CoordinateMapper(&mapper);
sensor->Open();
sensor->OpenMultiSourceFrameReader(
FrameSourceTypes::FrameSourceTypes_Depth | FrameSourceTypes::FrameSourceTypes_Color,
&reader);
IMultiSourceFrame* framesource;
cout << "Find!!!";
getchar();
return 100;
}
else {
return -100;
}
getchar();
return 10;
}
逻辑上,当我没有将 Kinect 传感器插入我的笔记本电脑时,控制台中应该打印:"not found sensor",不是吗?但是,在控制台打印:"Find!!!"。有什么问题?
不,从 SDK v2 开始,您可以使用 KinectStudio 调试应用程序,即使没有物理 kinect 连接到系统。如果要检查是否连接了实际的Kinect,则需要使用传感器本身的IsAvailable
属性。 GetDefaultKinectSensor
将始终为您提供 S_OK
,除非您遇到运行时或安装问题。 GetDefaultKinectSensor
不会检查这个流是来自实际的物理 kinect 传感器还是来自 KinectStudio。
以下是我项目中的代码片段。如果你想要更多关于 Kinect 的例子,请参考我在 github https://github.com/shanilfernando/VRInteraction 中的项目或在这里评论。我非常乐意为您提供帮助。
HRESULT CDepthBasics::InitializeDefaultSensor()
{
HRESULT hr;
hr = GetDefaultKinectSensor(&m_pKinectSensor);
if (FAILED(hr))
{
return hr;
}
if (m_pKinectSensor)
{
if (SUCCEEDED(hr))
{
hr = m_pKinectSensor->get_CoordinateMapper(&m_pCoordinateMapper);
}
if (SUCCEEDED(hr))
{
hr = m_pKinectSensor->Open();
}
if (SUCCEEDED(hr))
{
hr = m_pKinectSensor->OpenMultiSourceFrameReader(
FrameSourceTypes::FrameSourceTypes_Depth | FrameSourceTypes::FrameSourceTypes_Color | FrameSourceTypes::FrameSourceTypes_Body | FrameSourceTypes::FrameSourceTypes_BodyIndex,
&m_pMultiSourceFrameReader);
}
}
if (!m_pKinectSensor || FAILED(hr))
{
std::cout << "No ready Kinect found!" << std::endl;
return E_FAIL;
}
else
{
std::cout << "Kinect found!" << std::endl;
}
return hr;
}
https://github.com/shanilfernando/VRInteraction/blob/master/DepthBasics.cpp
编辑
我没有使用 IsAvailable
,因为对我来说,流的来源并不重要。有时我使用 KinectStudio 来获取流,而 Kinect 不在身边。我说过 GetDefaultKinectSensor
会 return S_OK
除非你有运行时或安装问题,我没有说 GetDefaultKinectSensor
总是会给你一个有效的 m_pKinectSensor
。由于我们无法访问 GetDefaultKinectSensor
的实现,作为一个好的做法,最好在使用它之前检查它是否 null
。 This is the official answer for your question from the Microsoft