C++ C++;代码:查找Kinect传感器时出现逻辑错误
我想在ViualStudio 2013中通过Windows SDK 2.0从Kinect V2获取深度和RGB数据。所以我写了这些代码:C++ C++;代码:查找Kinect传感器时出现逻辑错误,c++,visual-studio,kinect-sdk,kinect-v2,C++,Visual Studio,Kinect Sdk,Kinect V2,我想在ViualStudio 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 in
#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;
}
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
常数int宽度=512;
const int height=424;
const int colorwidth=1920;
常数int colorheight=1080;
//Kinect变量
IKinectSensor*传感器;//Kinect传感器
IMultiSourceFrameReader*读卡器;//Kinect数据源
i坐标映射器*映射器;
int main(int argc,char*argv[]){
如果(失败(GetDefaultKinectSensor(&sensor))){
printf(“未找到传感器”);
getchar();
返回-100;
}
中频(传感器){
传感器->获取坐标映射器(&mapper);
传感器->打开();
传感器->OpenMultiSourceFrameReader(
FrameSourceTypes::FrameSourceTypes_深度| FrameSourceTypes::FrameSourceTypes_颜色,
&读者);
IMultiSourceFrame*帧源;
cout否,由于SDK v2,即使没有物理kinect连接到系统,您也可以使用kinect Studio调试应用程序。如果要检查实际kinect是否已连接,您需要使用传感器本身的IsAvailable
属性。GetDefaultKinect sensor
将始终为您提供S_OK
unless您有运行时或安装问题。GetDefaultKinect传感器
不会检查此流是来自实际的物理kinect传感器还是来自kinect Studio
以下是我的项目的代码片段。如果您想要更多关于Kinect的示例,请参考我在github中的项目或在此处发表评论。我非常乐意帮助您
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;
}
HRESULT CDepthBasics::InitializedFaultSensor()
{
HRESULT-hr;
hr=GetDefaultKinectSensor(&m_传感器);
如果(失败(小时))
{
返回人力资源;
}
中频(万用表传感器)
{
如果(成功(hr))
{
hr=m_传感器->获取协调映射(&m_pCoordinateMapper);
}
如果(成功(hr))
{
hr=m_传感器->打开();
}
如果(成功(hr))
{
hr=m_传感器->OpenMultiSourceFrameReader(
FrameSourceTypes::FrameSourceTypes_Depth | FrameSourceTypes::FrameSourceTypes_Color | FrameSourceTypes::FrameSourceTypes_Body索引,
&MpmuMultisourceFrameReader);
}
}
如果(!m| | |传感器故障(hr))
{
std::cout如果找不到默认的Kinect传感器,它会将传感器设置为NULL吗?如果没有,可能尝试将传感器初始化为NULL。可能它没有成功找到传感器,也没有设置传感器指针?我对Kinect编程知之甚少,所以我可能错了。:)在您的github上,我看到您将m_pKinectSensor初始化为NULL.Since在您的项目中,导致GetDefaultKinectSensor的代码看起来大致相同,我认为是未初始化的指针导致了@masoomi的问题。@DavidVereb请检查编辑,我在那里添加了您的困惑的答案。感谢您提供的额外信息!我试图在您的github项目中找到可用的但未被禁用如果GetDefaultKinectSensor
总是在S_OK
上返回一个好的传感器指针(无论是指向真正的kinect设备还是KinectStudio仿真设备),为什么还要检查If(m_传感器)
?此外,阅读后,似乎“COM\u Outptr\u”注释可以保证指针在出现故障时被设置为NULL,因此忘记初始化为NULL肯定不是问题。如果您想要开源,请查看OPENNI。它是Kinect SDK的核心。OPENNI是由一家以色列公司开发的。Microsoft使用OPENNI在那里构建SDK后来,苹果公司带来了整个公司并关闭了OPENNI开源项目。但你仍然可以找到OPENNI。我自己保存了一份副本,因为它非常有用。所有骨架跟踪算法和更多的算法都在那里实现,它们是Kinect官方SDK和苹果Structure Sensor SDK的基础。