设置两个kinect:v1和v2
Setup two kinect: v1 and v2
我计划使用两个 Kinect。我已经安装了Kinect的VS C#、SDK 1.8和2.0,我的问题是:
添加一个参考库(例如 1.8)后,无法添加另一个(例如 2.0,消息 "the reference... already exists")。我认为这是由于命名空间的名称和 classes 是相同的。所以,我无法实例化第二个传感器,
请建议我如何解决它,特别是是否有任何方法可以访问同一资源的不同版本(例如 1.8 和 2.0 版中的 KinectSensor class)?
您的问题有多种解决方案。第一个(可能是最幼稚的)是创建两个不同的项目,每个项目都有不同的引用。然后你可以编写第三层,使用前两个项目提供的数据。
如果您真的需要在同一个项目中使用这两个引用,还有另一种选择,它包括使用 extern aliases.
首先,添加一个参考(例如,Microsoft.Kinect,版本1.8)。然后,保存您的项目并关闭 Visual Studio。在项目文件夹中,您应该找到一个 .csproj 文件,您可以使用文本编辑器打开该文件。查看它的内容,你会发现这样一行:
<Reference Include="Microsoft.Kinect, Version=1.8.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
现在,将上面的行更改为以下行:
<Reference Include="Microsoft.Kinect, Version=1.8.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Aliases>KinectV1</Aliases>
</Reference>
<Reference Include="Microsoft.Kinect, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Aliases>KinectV2</Aliases>
</Reference>
您现在应该在同一个项目中看到这两个引用,当您使用 Visual Studio 打开它时也是如此。
那么你应该可以使用这样的东西:
// You must declare aliases here:
extern alias KinectV1;
extern alias KinectV2;
// Then some using...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// ... and do not forget Kinect!
using KinectV1;
using KinectV2;
// Now you can do something like this:
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
// Something from Microsft.Kinect V2
KinectV2.Microsoft.Kinect.HandState hs = KinectV2.Microsoft.Kinect.HandState.Closed;
// Something from Microsft.Kinect V1
KinectV1.Microsoft.Kinect.Skeleton s = new KinectV1.Microsoft.Kinect.Skeleton();
}
}
}
如果您的项目无法编译,请尝试关闭 Visual Studio 并删除隐藏的 .suo 文件(在 的同一文件夹中)。 sln 你项目的文件)。
如果还有什么问题,请查看this answer。
我计划使用两个 Kinect。我已经安装了Kinect的VS C#、SDK 1.8和2.0,我的问题是:
添加一个参考库(例如 1.8)后,无法添加另一个(例如 2.0,消息 "the reference... already exists")。我认为这是由于命名空间的名称和 classes 是相同的。所以,我无法实例化第二个传感器,
请建议我如何解决它,特别是是否有任何方法可以访问同一资源的不同版本(例如 1.8 和 2.0 版中的 KinectSensor class)?
您的问题有多种解决方案。第一个(可能是最幼稚的)是创建两个不同的项目,每个项目都有不同的引用。然后你可以编写第三层,使用前两个项目提供的数据。
如果您真的需要在同一个项目中使用这两个引用,还有另一种选择,它包括使用 extern aliases.
首先,添加一个参考(例如,Microsoft.Kinect,版本1.8)。然后,保存您的项目并关闭 Visual Studio。在项目文件夹中,您应该找到一个 .csproj 文件,您可以使用文本编辑器打开该文件。查看它的内容,你会发现这样一行:
<Reference Include="Microsoft.Kinect, Version=1.8.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
现在,将上面的行更改为以下行:
<Reference Include="Microsoft.Kinect, Version=1.8.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Aliases>KinectV1</Aliases>
</Reference>
<Reference Include="Microsoft.Kinect, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Aliases>KinectV2</Aliases>
</Reference>
您现在应该在同一个项目中看到这两个引用,当您使用 Visual Studio 打开它时也是如此。
那么你应该可以使用这样的东西:
// You must declare aliases here:
extern alias KinectV1;
extern alias KinectV2;
// Then some using...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// ... and do not forget Kinect!
using KinectV1;
using KinectV2;
// Now you can do something like this:
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
// Something from Microsft.Kinect V2
KinectV2.Microsoft.Kinect.HandState hs = KinectV2.Microsoft.Kinect.HandState.Closed;
// Something from Microsft.Kinect V1
KinectV1.Microsoft.Kinect.Skeleton s = new KinectV1.Microsoft.Kinect.Skeleton();
}
}
}
如果您的项目无法编译,请尝试关闭 Visual Studio 并删除隐藏的 .suo 文件(在 的同一文件夹中)。 sln 你项目的文件)。
如果还有什么问题,请查看this answer。