我刚刚进入Kinect 2编程,现在我遇到了HighDefinitionFace的一些问题。我有一个非常简单的C#程序,它应该启动Kinect相机,告诉我它已经启动,然后输出主题的发色,如下所示:
static class Program
{
static KinectSensor mySensor = null;
static HighDefinitionFaceFrame frames = null;
static HighDefinitionFaceFrameSource frameSource = null;
static HighDefinitionFaceFrameReader frameReader = null;
public static void Main()
{
mySensor = KinectSensor.GetDefault();
mySensor.Open();
System.Console.WriteLine(mySensor.IsAvailable);
frameSource = new HighDefinitionFaceFrameSource(mySensor);
frameReader = frameSource.OpenReader();
frames = frameReader.AcquireLatestFrame();
System.Console.WriteLine(frames.FaceModel.HairColor);
}
}
一切正常,直到我尝试初始化frameSource,然后它抛出一个InvalidOperationException:
未处理的类型' System.InvalidOperationException'发生在Microsoft.Kinect.Face.dll
其他信息:此API已从HRESULT:0x80070002
返回异常
有两个内部异常,引用了无法找到的错误放置的文件。我认为该问题基于Microsoft API reference:
中的以下行每个使用Microsoft.Kinect.Face.dll的应用程序都必须与Microsoft.Kinect.Face.dll附带的NuiDatabase文件夹打包在一起。 face dll仅保证与其附带的特定NuiDatabase文件夹一起使用。 face API用于在初始化时从NuiDatabase文件夹加载数据库文件,并在与Microsoft.Kinect.Face.dll相同的位置查找该文件夹。
所以,我的问题是,如何确保使用.dll可以访问此NuiDatabase文件夹?
我试过的东西:
- Kinect SDK 2.0在不同目录中包含大约五个Microsoft.Kinect.Face.dll实例,每个实例在同一目录中都有一个NuiDatabase文件夹。所有这些.dll和NuiDatabase文件夹看起来都是相同的。我已经尝试将这些.dll中的每一个设置为引用,并且它们都给出了相同的结果。
- 创建包含.dll和NuiDatabase文件夹的本地NuGet包,并将其添加到项目中。我已经在自己的Lib文件夹中使用和不使用.dll进行了尝试。它正确引用了Microsoft.Kinect.Face并允许我声明所有必需的类型,但它仍然在同一行引发相同的错误。
我的设置中可能有任何其他建议或任何我可能错过的建议吗?
答案 0 :(得分:1)
我最终在https://www.nuget.org/packages/Microsoft.Kinect.Face.x64/使用了预制的NuGet包。
将此包添加到我的项目中解决了这个问题。
答案 1 :(得分:1)
您也可以尝试将此行添加到Post-build事件命令行:
xcopy "$(KINECTSDK20_DIR)Redist\Face\$(Platform)\NuiDatabase" "$(TargetDir)\NuiDatabase" /S /R /Y /I
要访问Post-build命令编辑器,请执行:
右键单击Project - >构建事件 - >编辑后期制作......