Kinect v2 Examples with-SDK 提示 技巧和示例简介

原帖:https://rfilkov.com/2015/01/25/kinect-v2-tips-tricks-examples/#t26

所有在KinectScripts文件夹中管理的目的是什么:

KinectScripts文件夹中的管理员是组件。您可以在项目中使用它们,具体取决于您所需要的功能。KinectManager是最常用的组件,需要与传感器进行交互,并从中获取基本数据,如颜色和深度流,以及Kinect空间中的主体和关节的位置(以米为单位)。AvatarController的目的是将检测到的关节位置和方向转换为一个操纵的骨架。CubemanController类似,但它可以与变换和线条一起工作来表示关节和骨骼,以便更轻松地定位跟踪问题。FacetrackingManager处理脸部点和头部/颈部方向。它由KinectManager内部使用(如果可以同时使用)来获取头部和颈部的精确位置和方向。InteractionManager用于控制手形光标并检测手柄,释放和点击。最后,SpeechManager用于识别语音命令。还要注意Samples-folder。它包含几个简单的例子(其中一些引用如下),你可以学习,直接使用或将部分代码复制到脚本中。

如何在您自己的Unity项目中使用Kinect v2-Package功能:

1.将文件夹的Assets文件夹中的KinectScripts文件复制到项目的Assets文件夹中。该文件夹包含软件包脚本,过滤器和接口。
2.将资源文件夹中的资源文件夹复制到项目的资产文件夹中。该文件夹包含所有需要的库和资源。您可以跳过复制您不打算使用的库(例如64位库或KinectV1库)以节省空间。
3.将文件夹的“标准资产”从包的资产文件夹复制到项目的资产文件夹中。它包含Kinect v2的MS-wrapper类。等到Unity检测并编译新复制的资源和脚本。
4.看到这个提示 另外,如果您想用Microsoft提供的Kinect-v2插件构建您的项目。

如何使用AvatarController使用自己的模型:

1.(可选)确保您的模型处于T形姿势。这是Kinect联合方向的零姿态。
2.在资产文件夹中选择模型资产。在“检查器”窗口中选择“钻机”选项卡。
3.将AnimationType设置为“Humanoid”和AvatarDefinition - 以“从此模型创建”。
4.按应用按钮。然后按下配置按钮以确保关节正确分配。之后退出配置窗口。
把模型放到场景中。
6.将KinectScript / AvatarController-script作为组件添加到场景中模型的游戏对象。
7.确保你的模型也有Animator组件,它被启用,并且它的头像设置被设置正确。
8.启用或禁用(根据需要)AvatarController组件的MirroredMovement和VerticalMovement设置。不要介意镜像运动启用时,模型的变换应该有180度的Y轴旋转。
运行场景来测试化身模型。如果需要的话,调整一些AvatarController的设置,然后再试一次。

如何使头像扭曲骨头:

要做到这一点,您需要将KinectManager的“允许手轮”设置设置为“全部”。KinectManager是示例场景中MainCamera的组件。此设置有三个选项:无 - 关闭所有手轮旋转,默认 - 打开手轮旋转,除了骨骼扭曲,全部 - 打开所有手轮旋转。

如何利用Kinect与GUI按钮和组件交互:

1.将InteractionManager添加到主摄像机或场景中的其他持久对象。它用于控制手形光标并检测手柄,释放和点击。握紧是指用拇指在其他手指上闭合的手,释放 - 打开的手,手当用户的手不移动(保持静止)约2秒时产生点击。
2.启用InteractionManager组件的“控制鼠标光标”设置。此设置将手形光标的位置和点击传输到鼠标光标,这样就可以与GUI按钮,切换和其他组件进行交互。
3.如果需要与GUI交互的拖放功能,请启用InteractionManager组件的“控制鼠标拖放”设置。该设置开始鼠标拖动,只要它检测到手抓地力,并继续拖动,直到检测到手释放。如果你启用了这个设置,你也可以用一个手柄点击GUI按钮,而不是通常的手点击(例如在按钮上方停留约2秒钟)。

如何获得深度或彩色相机纹理:

首先,确保启用KinectManager组件的“计算用户映射”设置,如果需要深度纹理,或者启用KinectManager组件的“计算颜色映射”设置,如果您需要彩色摄像机质地。然后在脚本的Update()方法中写下类似的内容:

KinectManager管理器= KinectManager.Instance;
如果(manager && manager.IsInitialized())
{
    Texture2D depthTexture = manager.GetUsersLblTex();
    Texture2D colorTexture = manager.GetUsersClrTex();
    //对纹理做些什么
}

如何获得身体关节的位置:

这在KinectScripts / Samples / GetJointPositionDemo脚本中演示。您可以将其作为组件添加到场景中的游戏对象,以便在行动中查看它。只需选择需要的联合,并可选择启用保存到CSV文件。不要忘记将KinectManager作为组件添加到场景中的游戏对象。它通常是示例场景中MainCamera的一个组件。这是演示脚本的主要部分,用于检索所选联合的位置:

KinectInterop.JointType joint = KinectInterop.JointType.HandRight;
KinectManager管理器= KinectManager.Instance;

如果(manager && manager.IsInitialized())
{
    如果(manager.IsUserDetected())
    {
        long userId = manager.GetPrimaryUserID();

        if(manager.IsJointTracked(userId,(int)joint))
        {
            Vector3 jointPos = manager.GetJointPosition(userId,(int)joint);
            //在联合位置上做些事情
        }
    }
}

如何使游戏对象以用户身份进行旋转:

这与前面的例子类似,并在KinectScripts / Samples / FollowUserRotation-脚本中演示。要看到它在实际中,你可以在你的场景中创建一个多维数据集,并添加脚本作为一个组件。不要忘记将KinectManager作为组件添加到场景中的游戏对象。它通常是示例场景中MainCamera的一个组件。

如何使游戏对象跟随用户的头部位置和旋转:

您需要将KinectManager和FacetrackingManager作为组件添加到场景中的游戏对象。例如,它们是KinectAvatarsDemo场景中MainCamera的组件。然后,为了得到头部的位置和方向,你需要在你的脚本中这样的代码:

KinectManager管理器= KinectManager.Instance;

如果(manager && manager.IsInitialized())
{
    如果(manager.IsUserDetected())
    {
        long userId = manager.GetPrimaryUserID();

        if(manager.IsJointTracked(userId,(int)KinectInterop.JointType.Head))
        {
            Vector3 headPosition = manager.GetJointPosition(userId,(int)KinectInterop.JointType.Head);
            Quaternion neckRotation = manager.GetJointOrientation(userId,(int)KinectInterop.JointType.Neck);
            //用头部位置和颈部方向做一些事情
        }
    }
}

如何获得面点的坐标:

您需要对各个FaceFrameResult对象的引用。这在KinectScripts / Samples / GetFacePointsDemo脚本中演示。您可以将其作为组件添加到场景中的游戏对象,以便在行动中查看它。为了在你的脚本中获得一个脸点坐标,你需要调用它的公共GetFacePoint()函数。不要忘记将KinectManager和FacetrackingManager作为组件添加到场景中的游戏对象。例如,它们是KinectAvatarsDemo场景中MainCamera的组件。

如何将Kinect捕捉的运动与Mecanim动画混合

1.使用AvatarControllerClassic而不是AvatarController组件。只分配这些必须由传感器动画的关节。
2.将AvatarControllerClassic的SmoothFactor设置为0,以立即应用检测到的骨取向。
3.创建一个头像身体蒙版并将其应用到Mecanim动画层。在此掩码中,禁用上述Kinect动画关节的Mecanim动画。不要禁用根联合!
4.启用KinectManager(示例场景中MainCamera的组件)的“Late Update Avatars”(晚更新头像)设置。
5.运行场景来检查设置。当玩家被传感器识别时,他的一部分关节将由AvatarControllerClassic组件动画,另一部分由Animator组件动画。

如何将您的模型添加到FittingRoom演示

1.对于每个fbx模型,导入模型并在Unity编辑器的Assets-view中选择它。
2.在检查器中选择钻机选项卡。将AnimationType设置为“Humanoid”,将AvatarDefinition设置为“从此模型创建”。
3.按下“应用”按钮。然后按配置按钮检查是否所有必需的接头都正确分配。服装模特通常不会使用所有关节,这可能会使头像定义失效。在这种情况下,您可以手动分配缺失的接头(以红色显示)。
4.请记住:模型中的关节位置必须与Kinect关节的结构相匹配。你可以看到他们,例如在KinectOverlayDemo2。否则,模型可能无法正确覆盖用户的身体。
5.在FittingRoomDemo / Resources-文件夹中为您的模型类别(衬衫,裤子,裙子等)创建一个子文件夹。
6.在模型分类文件夹中,为所有在p.1型号中导入的数字(0000,0001,0002等)创建一个子文件夹。
7.将模型移动到这些数字文件夹中,每个文件夹一个模型,以及所需的材质和纹理。将模型的fbx文件重命名为“model.fbx”。
8.您可以在各自的模型文件夹中以jpeg格式(100 x 143px,24bpp)放置每个模型的预览图像。然后将其重命名为“preview.jpg.bytes”。如果您没有放置预览图像,则试衣间演示将在模型选择菜单中显示“无预览”。
9.打开FittingRoomDemo1场景。
10.将模型类别的ModelSelector组件添加到KinectController游戏对象。将其“模型类别”设置为与上面第5页中创建的子文件夹的名称相同。设置“模型数量”设置,以反映上面第6页中创建的子文件夹的数量。
11. ModelSelector组件的其他设置必须与演示中现有的ModelSelector相似。即“相对于相机的模型”必须设置为“BackgroundCamera”,“前景摄像头”必须设置为“MainCamera”,“连续缩放” - 启用。比例因子设置最初可以设置为1,“垂直偏移”设置为0.稍后,您可以稍微调整它们,以提供最佳的模型 - 人体覆盖。
12.如果您希望所选模型在模型类别更改后继续覆盖用户的身体,请启用“保持选定模型” - “模型选择器”组件的设置。这是有用的,如果有几个类别(例如,ModelSelectors),例如用于衬衫,裤子,裙子等等。在这种情况下,所选择的衬衫模型仍然覆盖用户的身体,当类别改变并且用户开始选择裤子实例。
13. CategorySelector组件为改变模型和类别提供了手势控制,并且为同一个用户负责切换模型类别(例如衬衫,裤子,领带等)。第一个用户已经有一个CategorySelector(player-index 0),所以你不需要添加更多。
14.如果您计划使用多用户试衣间,则为每个其他用户添加一个CategorySelector组件。您也可能需要为这些用户也将使用的模型类别添加相应的ModelSelector组件。
15.运行场景以确保可以在列表中选择模型,并正确覆盖用户的身体。如果需要进行一些实验,找出提供最佳模型与实体叠加的比例因子和垂直偏移设置的值。
16.如果要关闭场景中的光标交互,请禁用KinectController-game对象的InteractionManager组件。如果您想要关闭手势(滑动切换模型和手动改变类别),请禁用CategorySelector组件的相应设置。如果您想要关闭或更改T型姿态校准,请更改KinectManager组件的“玩家校准姿态”设置。
17. 最后但并非最不重要的:您可以使用FittingRoomDemo2场景来利用或试验单个叠加模型。调整AvatarScaler的比例因子设置,以便根据需要微调模型的全身,手臂或腿骨的比例。如果您希望模型在每个更新中重新缩放,请启用“连续缩放”设置。

如何设置传感器高度和角度

KinectManager组件的两个非常重要的设置影响用户和关节空间坐标的计算,因此在演示场景中几乎所有与用户有关的可视化都是如此。以下是如何正确设置它们:

1.设置“传感器高度”设置,以传感器的高度为单位,以米为单位。默认值是1,即高于地面1.0米,这可能不是你的情况。
2.设置“传感器角度”设置,关于传感器的倾斜角度,以度为单位。如果传感器向上倾斜,则使用正向度;如果向下倾斜,则使用负向度。默认值为0,即0度,即传感器根本不倾斜。
3.因为手动估算传感器角度并不容易,所以可以使用“自动高度角”设置来找出这个值。选择“仅显示信息”选项并运行演示场景。然后站在传感器前面。屏幕上的信息将显示粗略的高度和角度设置,由传感器本身估计。重复这个2-3次,记下你看到的值。
4.最后,将“传感器高度”和“传感器角度”设置为您找到的最佳估算值。将“自动高度角”设置回“不使用”。
5.如果您发现传感器估计的高度和角度值足够好,或者如果您的传感器设置不固定,您可以将“自动高度角”设置为“自动更新”。当传感器视场中有用户时,它将不断更新“传感器高度”和“传感器角度”设置。

是否有任何事件,当用户被发现或丢失

没有针对用户检测/用户丢失事件的特殊事件处理程序,但是您可以使用另外两个选项:

1.在脚本的Update() - 方法中,调用KinectManager的GetUsersCount()函数,并将返回值与先前保存的值进行比较,如下所示:

KinectManager管理器= KinectManager.Instance;
如果(manager && manager.IsInitialized())
{
    int usersNow = manager.GetUsersCount();

    如果(usersNow> usersSaved)
    {
        //检测到新用户
    }
    如果(usersNow 
    {
        //用户丢失了
    }

    usersSaved = usersNow;
}

2.创建一个实现KinectGestures.GestureListenerInterface的类,并将其作为组件添加到场景中的游戏对象。它有方法UserDetected()和UserLost(),你可以使用它作为用户事件处理程序。其他方法可以留空或返回默认值(true)。如果您需要示例,请参阅SimpleGestureListener或GestureListener类。

如何处理像滑动和姿势的离散手势像手提

大部分手势,如SwipeLeft,SwipeRight,Jump,Squat等都是离散的。所有的姿势,如RaiseLeftHand,RaiseRightHand等也被视为离散手势。这意味着这些手势可能会报告进展与否,但最终都会完成或取消。在手势监听器脚本中处理这些手势相对容易。你需要做如下:

1.在脚本的UserDetected()函数中,为每个需要跟踪的手势添加以下行:

manager.DetectGesture(userId,KinectGestures.Gestures.xxxxx);

2.在GestureCompleted()中添加代码来处理离散手势,如下所示:

如果(手势== KinectGestures.Gestures.xxxxx)
{
    //检测到手势 - 对其进行处理(例如设置标志或执行操作)
}

3.在GestureCancelled()函数中,添加代码来处理连续手势的取消:

如果(手势== KinectGestures.Gestures.xxxxx)
{
    //手势被取消 - 处理它(例如,清除标志)
}

如果您需要代码示例,请参阅SimpleGestureListener.cs或CubeGestureListener.cs脚本。

4.  从v2.8开始,KinectGestures.cs不再是一个静态类,而是一个可以扩展的组件,例如检测新的手势或姿势。如果需要在场景中进行手势或姿势检测,则需要将其作为组件添加到KinectController游戏对象中。

如何处理连续手势,如ZoomIn,ZoomOut和Wheel

一些手势,如ZoomIn,ZoomOut和Wheel,是连续的。这意味着这些手势不会完全完成,只要检测到手势,只报告超过50%的进度。要在手势侦听器脚本中处理它们,请执行以下操作:

1.在脚本的UserDetected()函数中,为每个需要跟踪的手势添加以下行:

manager.DetectGesture(userId,KinectGestures.Gestures.xxxxx);

2.在GestureInProgress()中添加代码来处理连续的手势,如下所示:

如果(手势== KinectGestures.Gestures.xxxxx)
{
    如果(进展> 0.5f)
    {
        //检测到手势 - 处理它(例如,设置一个标志,获取缩放因子或角度)
    }
    其他
    {
        //手势不再被检测到 - 处理它(例如,清除标志)
    }
}

3.在GestureCancelled()函数中,添加代码来处理连续手势的结尾:

如果(手势== KinectGestures.Gestures.xxxxx)
{
    //手势被取消 - 处理它(例如,清除标志)
}

如果您需要代码示例,请参阅SimpleGestureListener.cs或ModelGestureListener.cs脚本。

4.  从v2.8开始,KinectGestures.cs不再是一个静态类,而是一个可以扩展的组件,例如检测新的手势或姿势。如果需要在场景中进行手势或姿势检测,则需要将其作为组件添加到KinectController游戏对象中。

如何在K2资产中使用视觉(VGB)手势

由视觉手势生成器(VGB)创建的视觉手势也可以在K2资产中使用。要做到这一点,请按照以下步骤操作(并在KinectGesturesDemo场景中查看VisualGestures-game对象及其组件):

1.将手势数据库(xxxxx.gbd)复制到资源文件夹,并将其重命名为“xxxxx.gbd.bytes”。
2.将VisualGestureManager脚本作为组件添加到场景中的游戏对象(请参见VisualGestures-game对象)。
3.将VisualGestureManager组件的“手势数据库”设置设置为步骤1('xxxxx.gbd')中使用的手势数据库的名称。
4.创建一个视觉手势侦听器来处理手势,并将其作为组件添加到场景中的游戏对象(请参阅SimpleVisualGestureListener脚本)。
5.在手势侦听器的GestureInProgress()函数中添加代码来处理检测到的连续手势,并在GestureCompleted()添加代码中处理检测到的离散手势。

如何改变语言或语法来进行语音识别

1.确保从这里安装了所需的语言包
2.设置SpeechManager组件的“语言代码”设置,关于您需要使用的语法语言。语言代码列表可以在这里找到(参见“LCID十进制”)。
3.确保SpeechManager组件的“语法文件名称”设置对应于Assets / Resources中grxml.txt文件的名称。
4.在Assets / Resources中打开grxml.txt-grammar文件,并将其xml:lang'-attribute设置为与步骤2中的语言代码对应的语言
。5.在语法文件中进行其他所需的修改并保存它。
6.(可选v2.7以后)删除Unity项目的根文件夹(Assets-folder的父文件夹)中同名的grxml文件。
7.运行现场检查,如果语音识别正确。

如何在纵向模式下运行试衣间或叠加演示

1.首先,将9:16(或3:4)宽高比添加到游戏视图的分辨率列表中(如果缺失)。
2.选择游戏视图的9:16(或3:4)纵横比,以纵向模式设置主相机输出。
3.打开试衣间或覆盖演示场景并选择BackgroundImage游戏对象。
4.启用PortraitBackground组件(从v2.7开始可用)并保存场景。
5.运行场景以纵向模式尝试。

如何从“Kinect-v2与MS-SDK”项目建立一个exe文件

默认情况下,Unity在Unity项目的根文件夹中生成exe文件(以及相应的xxx_Data文件夹)。建议您使用另一个空文件夹。原因是在你的Unity项目文件夹中构建exe文件可能会导致编辑器使用的本地库和exe使用的本地库之间的冲突,如果它们具有不同的体系结构(例如,编辑器是64位的, exe是32位)。

另外,在构建exe文件之前,请确保已经将K2资源中的Assets / Resources-folder复制到Unity项目中。它包含所需的本机库和自定义着色器。您也可以从资源文件夹中删除不需要的zip.bytes文件。这将节省大量的建设空间。例如,如果您只定位到Kinect-v2,则可以删除与Kinect-v1和OpenNi2相关的压缩库。该exe不会需要它们。

如何使Kinect-v2软件包与Kinect-v1一起工作

如果您的计算机上只安装了Kinect v2 SDK或Kinect v1 SDK,则KinectManager应正确检测已安装的SDK和传感器。但是如果您同时安装了Kinect SDK 2.0和SDK 1.8,则KinectManager将优先使用Kinect v2 SDK,而您的Kinect v1将不会被检测到。原因是你也可以在脱机模式下使用SDK 2.0,也就是说,不需要附加传感器。在这种情况下,您可以通过在Kinect Studio 2.0中播放录制的文件来模拟传感器。

如果要使KinectManager使用适当的接口(取决于当前连接的传感器),请打开KinectScripts / Interfaces / Kinect2Interface.cs,并在其开始处将“sensorAlwaysAvailable”的值从“true”更改为“false”。之后,关闭并重新打开Unity编辑器。然后,在每次启动时,KinectManager将尝试检测当前连接到您的机器的传感器,并使用相应的传感器接口。这样,您可以根据自己的喜好切换传感器(Kinect v2或v1),但无法使用Kinect v2的离线模式。要再次使用Kinect v2离线模式,您需要将“sensorAlwaysAvailable”切换回true。

“计算用户地图”设置的选项意味着什么?

以下是可用选项的一行说明:

  • RawUserDepth表示只有来自传感器的原始深度图像值可以通过GetRawDepthMap()函数获得;
  • BodyTexture意味着GetUsersLblTex()函数将返回被跟踪用户的白色图像;
  • UserTexture会造成GetUsersLblTex()返回跟踪用户的柱状图形象;
  • CutOutTexture结合启用的“ 计算颜色映射 ”设置,意味着GetUsersLblTex()将返回用户的剪切图像。

所有这些选项(RawUserDepth除外)都可以立即进行测试,如果启用了“ 显示用户映射 ”,也可以设置KinectManager组件。

如何设置用户检测顺序

KinectManager组件有一个“用户检测顺序”设置。您可以使用它来确定应如何完成用户检测,具体取决于您的要求。以下是可用选项的简短说明:

  • 外观是默认选中的。这意味着玩家指数按照用户出现的顺序进行分配。第一个检测到的用户获得玩家索引0,下一个获得索引1等。如果用户0丢失,剩余的用户不被重新排序。下一个新检测到的用户将取代它;
  • 距离是指根据检测到的用户到传感器的距离来分配玩家指数。最接近的一个会得到玩家索引0,下一个最接近的索引1等。如果用户迷路,则根据到剩余用户的距离重新排序玩家指数;
  • 从左到右意味着根据检测到的用户的X位置来分配玩家指数。最左边的将获得玩家索引0,下一个最左边的索引1等。如果用户迷路,则玩家索引被重新排序,取决于剩余用户的X位置;

用户检测区域可以进一步受限于“最小用户距离”,“最大用户距离”和“最大左右距离”设置,距离传感器数米。可以通过降低“最大跟踪用户”设置的值来限制检测到的用户的最大数量。

如何在FittingRoom演示中启用人体混合,或者禁用它以增加FPS

如果您在KinectFittingRoom1演示场景(v2.10或更高版本)中选择了MainCamera,则会看到一个名为UserBodyBlender的组件。它负责将服装模型(覆盖用户)与真实世界对象(包括用户的身体部位)混合,具体取决于与相机的距离。例如,如果你的武器或其他真实世界的物体在模型前面,你会看到它们覆盖模型,正如所料。

您可以启用该组件,以打开用户的身体混合功能。“深度阈值”设置可用于调整到模型前部的最小距离(以米为单位)。它决定了什么时候真实世界的对象将变得可见。它默认设置为0.1米,但是您可以尝试一下,看看是否有其他值更适合您的模型。如果场景性能(以FPS为单位)不足,并且主体混合不重要,则可以禁用UserBodyBlender组件以提高性能。

如何构建Windows-Store(UWP-8.1)应用程序

要做到这一点,您至少需要K2资产的v2.10.1。要构建“Windows商店”,首先在“构建设置”中选择“Windows商店”作为平台,然后按“交换平台”按钮。然后执行如下操作:

1.解压缩资源/插件 - Metro.zip。这将创建资产/插件,地铁文件夹。
2.删除KinectScripts / SharpZipLib文件夹。
3.或者,删除资产/资源中的所有zip.bytes文件。Windows / Store中不需要这些库。所有Kinect-v2库位于Plugins-Metro文件夹中。
4.从菜单中选择“文件/构建设置”。添加你想建立的场景。选择“Windows Store”作为平台。选择“8.1”作为目标SDK。然后点击生成按钮。为Windows商店项目选择一个空文件夹并等待生成完成。
5.转到生成文件夹并用Visual Studio打开生成的解决方案(.sln文件)。
6.将“默认”ARM处理器目标更改为“x86”。Kinect传感器与ARM处理器不兼容。
7.在项目窗口中右键单击“引用”,然后选择“添加引用”。选择“扩展”,然后选择WindowsPreview.Kinect和Microsoft.Kinect.Face库。然后按确定。
8.打开解决方案的清单文件“Package.appxmanifest”,进入“Capabilities”选项卡,在左侧面板中启用“Microphone”和“Webcam”。保存清单。当UWP应用程序启动时,这是启用传感器所必需的。感谢Yanis Lukes(又名Pendrokar)提供此信息!
9.建立项目。运行它,在本地进行测试。不要忘记在你的机器上打开Windows开发者模式。

如何与多个用户合作

Kinect-v2可以同时完全追踪多达6个用户。这就是为什么许多与Kinect相关的组件,如AvatarController,InteractionManager,model&category-selectors,gesture&interaction listeners等都有一个叫做“Player index”的设置。如果设置为0,则相应的组件将跟踪第一个检测到的用户。如果设置为1,则组件将跟踪第二个检测到的使用情况。如果设置为2 - 第三个用户等。用户检测的顺序可以通过KinectManager(KinectController游戏对象的组件)的“用户检测顺序”设置指定。

如何使用FacetrackingManager

FacetrackingManager组件可用于多种目的。首先,当场景中有角色(使用AvatarController组件的人形模型)时,将其添加为KinectController的组件将提供更精确的颈部和头部跟踪。如果需要HD人脸跟踪,可以启用FacetrackingManager组件的“获取人脸模型数据”设置。请记住,使用高清人脸跟踪会降低性能,并可能导致内存泄漏,这可能会导致多场景重新启动后Unity崩溃。请仔细使用此功能。

在启用“获取人脸模型数据”的情况下,不要忘记将“网格物体”(例如“四边形”)分配到“人脸模型网格”设置。还要注意“纹理模型网格”的设置。可用选项有:“无” - 表示网格不会被纹理化; “色彩映射” - 网格将从彩色相机图像中获取其纹理,即它将再现用户的脸部; “脸部矩形” - 脸部网格将使用其材质的反照率纹理进行纹理化,而UI坐标将与检测到的脸部矩形匹配。

最后,您可以使用FacetrackingManager公共API获取大量的人脸跟踪数据,如用户的头部位置和旋转,动画单位,形状单位,人脸模型顶点等。

如何将背景图像添加到FittingRoom演示(已在v2.14及更高版本中更新)

要使用您选择的背景图像替换FittingRoom场景中的彩色相机背景,请执行以下操作:

1.在场景中启用KinectController-game对象的BackgroundRemovalManager组件。
2.确保KinectManager(KinectController的组件)的“计算用户图”(Compute user map)设置被设置为“主体纹理”,并启用“计算颜色映射”设置。
3.将所需的背景图像设置为场景中BackgroundImage1 - 游戏对象的RawImage组件的纹理。
运行现场检查,如果它按预期工作。

如何在VR环境中移动位置追踪用户的FPS头像

在VR环境中移动第一人称头像有两个选择(K2VR资产中的第一个头像演示场景):

1.如果使用Kinect的位置追踪,请关闭Oculus / Vive位置追踪,因为它们的坐标与Kinect的坐标不同。
2.如果您喜欢使用Oculus / Vive位置追踪:
- 启用头像游戏对象的AvatarController组件的“外部根部运动”设置。这将禁用关于Kinect特殊坐标的头像运动。
- 启用头像游戏对象的HeadMover组件,并将MainCamera分配为“Target transform”,以跟随Oculus / Vive位置。

现在尝试运行这个场景。如果MainCamera用作位置目标有问题,请执行以下操作:
- 向场景添加一个空的游戏对象。它将用于跟随Oculus / Vive位置。
- 将新创建的游戏对象分配给HeadMover组件的“目标变换”设置。
- 为新创建的游戏对象添加脚本,并在该脚本的Update()函数中以编程方式将对象的变换位置设置为当前的Oculus / Vive位置。

如何创建自己的手势

对于手势识别,有两个选项 - 可视化手势(使用Visual Gesture Builder创建,Kinect SDK 2.0的一部分)以及在KinectGestures.cs中以编程方式实现的程序化手势。后者主要基于不同关节的位置,以及它们在不同时刻如何站立。

这是一个关于创建和检查视觉手势视频还请检查手势演示/ VisualGestures演示场景,以了解如何在Unity中使用视觉手势。视觉手势的一个问题是,他们通常只在32位版本中工作。

程序化的手势应该用C#编写,在KinectGestures.cs(或扩展它的类)中编码。要开始编写程序化手势,请首先阅读K2资产的_Readme文件夹中的“如何使用手势...”pdf文档。起初看起来很困难,但在编码手势上成为专家只是时间和经验的问题。您可以直接访问jointPos-array,其中包含所有关节位置和jointsTracked-array,包含各自的联合跟踪状态。请记住,所有关节位置都是以米为单位的世界坐标。一些辅助函数也可以在你的处理中使用,比如SetGestureJoint(),SetGestureCancelled(),CheckPoseComplete()等等。也许我会在不久的将来写一个关于手势编码的单独的教程。

与利用程序化手势相关的演示场景也在GesturesDemo文件夹中。KinectGesturesDemo1场景显示如何利用离散手势,而KinectGesturesDemo2场景则是连续手势。

关于听力在Unity场景姿势的更多提示,可以发现上面查看关于离散,连续和视觉手势的提示(也可以是离散和连续的)。

如何启用或禁用对推断关节的跟踪

首先,请记住:
1. KinectManager的“忽略推断关节”设置。KinectManager通常是演示场景中KinectController游戏对象的一个​​组件。
2.有一个KinectManager的公共API方法,称为IsJointTracked()。这个方法被演示场景中的各种脚本和组件所利用。

下面是它的工作原理:
Kinect SDK跟踪所有身体关节的位置以及它们各自的跟踪状态。这些状态可以被跟踪,不被跟踪或被推断。当忽略推断joints'-设置被启用”时,IsJointTracked() -方法返回true,当当状态NotTracked跟踪状态进行跟踪或推断的,假。即跟踪和推断关节都被认为是有效的。当禁用该设置时,IsJointTracked() - 方法返回true,跟踪状态为Tracked时返回true,当状态为NotTracked或Inferred时返回false。也就是说,只有真正被跟踪的关节才被认为是有效的。

如何使用Microsoft提供的Kinect-v2插件构建exe文件

如果您只定位Kinect的-V2传感器,并且想跳过包装附带在构建的K2-资产的所有本机库,以及拆包他们到可执行的工作目录之后,具体操作如下:

1.从这里下载并解压缩Kinect-v2 Unity插件
2.打开你的Unity项目。从菜单中选择“Assets / Import Package / Custom Package”,导入“Kinect.2.0.1410.19000.unitypackage”中的插件文件夹你可以在上面第1页的解压缩包中找到它。请不要从unitypackage的“Standard Assets”文件夹中导入任何内容。所有需要的标准资产已经存在于K2资产中。
3.如果在场景中使用FacetrackingManager,则还要从“Kinect.Face.2.0.1410.19000.unitypackage”中导入插件文件夹如果您正在使用视觉手势(即在您的场景中的VisualGestureManager),导入插件文件夹从“Kinect.VisualGestureBuilder.2.0.1410.19000.unitypackage”也是如此。同样,请不要从统一包的“标准资产”文件夹中导入任何内容。所有需要的标准资产已经存在于K2资产中。
4.删除资产/资源 - 文件夹中的所有压缩库。您可以在资产窗口中将它们看作.zip文件,或者在Windows资源管理器中看作.zip.bytes文件。在Assets文件夹中也删除Plugins-Metro(zip文件)。所有这些压缩库在运行时不再需要。
5.删除Unity项目的根文件夹中的所有dll。根文件夹是项目的“资产”文件夹的父文件夹,在编辑器中不可见。删除根文件夹中的NuiDatabase-和vgbtechs-文件夹。这些DLL和文件夹不再需要,因为它们现在是项目的插件文件夹的一部分。
6.尝试运行项目中与Kinect-v2相关的场景,以确保它们仍然按预期工作。
7.如果一切正常,再次生成可执行文件。这应该适用于x86和x86_64体系结构以及Windows-Store,SDK 8.1。

如何构建Windows-Store(UWP-10)应用程序

要做到这一点,您至少需要K2资产的v2.12.2。然后按照下面的步骤:

1.(可选,从2.14.1版开始)删除KinectScripts / SharpZipLib文件夹。UWP不需要。如果离开它,可能会在稍后导致语法错误。
2.在Unity编辑器中打开“File / Build Settings”,切换到“Windows store”平台,选择“Universal 10”作为SDK。确保选择“.Net”作为脚本后端。如果您想稍后在Visual Studio中编辑Unity脚本,可以选择启用“Unity C#项目”和“开发构建”设置。
3.按“构建”按钮,选择输出文件夹,然后等待Unity完成导出UWP-Visual Studio解决方案。
4.关闭或最小化Unity编辑器,然后在Visual Studio中打开导出的UWP解决方案。
5.在Visual Studio中选择x86或x64作为目标平台。
6.打开主项目的“Package.appmanifest”,在“Capabilities”选项卡上启用“Microphone”和“Webcam”。这些可能会在Unity的Windows商店的播放器设置中启用。
7.如果你已经启用了上面第2页的“Unity C#项目”设置,右键单击解决方案资源管理器中的“Assembly-CSharp”项目,从上下文菜单中选择“属性”,然后选择“Windows 10周年纪念版(10.0; Build 14393)“作为”目标平台“。否则,你会得到编译错误。
8.在本地或远程机器上构建并运行解决方案。它应该现在工作。

请介意FacetrackingManager和SpeechRecognitionManager组件,因此使用它们的场景将不适用于当前版本的K2-UWP接口。

如何运行投影机演示场景(v2.13及更高版本)

要运行KinectProjectorDemo场景,您需要先将投影机校准到Kinect传感器。要做到这一点,请按照下列步骤操作:

1.进入RoomAliveToolkit-GitHub页面并按照“ProCamCalibration README”的说明进行操作。
2.要进行校准,首先需要使用Microsoft Visual Studio 2015或更高版本构建ProCamCalibration-project。为了您的方便,下面是使用VS-2015制作的所需可执行文件现成版本
3. ProCamCalibration完成后,将生成的校准xml文件复制到KinectDemos / ProjectorDemo / Resources。
4.在Unity编辑器中打开KinectProjectorDemo-scene,在Hierarchy中选择MainCamera-game对象,然后将由ProCamCalibrationTool生成的校准xml文件拖到ProjectorCamera组件的“Calibration Xml”设置中。如果“配置中的项目名称”与投影机名称相同,请检查校准xml文件中的设置。
5.运行场景并在Kinect sesnor前面行走,检查投影机是否将骨骼投影覆盖在身体上。

如何在场景背景上渲染背景和背景去除图像

首先,如果您想用背景去除图像替换FittingRoom演示场景中的彩色相机背景,请参阅并按照以下步骤操作

对于所有其他演示场景:您可以通过执行以下(相当复杂的)步骤,将场景背景上的彩色摄像机图像替换为背景去除图像:

1.在场景中创建一个空的游戏对象,将其命名为BackgroundImage1,并添加“GUI Texture”组件(在Unity 2017.2发布之后,它将发生变化,因为它弃用了GUI-Textures)。将其变换位置设置为(0.5,0.5,0),将其居中在屏幕上。这个对象将用于渲染场景背景,所以你可以选择一个合适的图片来设置其GUITexture组件的纹理设置。如果将其“纹理”设置保留为“无”,则天空框或纯色将被渲染为场景背景。

2.以类似的方式创建一个BackgroundImage2游戏对象。此对象将用于呈现检测到的用户,因此将GUITexture组件的Texture设置保留为None(它将在运行时由脚本设置),并将该对象的Y尺寸设置为-1。这是垂直翻转渲染的纹理所需要的。原因是:Unity贴图从上到下呈现,而Kinect图像则从上到下。

3.将KinectScripts / BackgroundRemovalManager脚本作为组件添加到场景中的KinectController游戏对象(如果它尚未存在)。这是需要提供背景去除功能的场景。

4.将KinectDemos / BackgroundRemovalDemo / Scripts / ForegroundToImage-script作为组件添加到BackgroundImage2游戏对象中。该组件将设置由BackgroundRemovalManager组件在运行时创建的前景纹理作为GUI-Texture组件的纹理(参见上面的p2)。

现在这个棘手的部分:需要两个摄像头才能在场景背景上显示用户图像 - 一个渲染背景图片,第二个渲染用户图像,最后 - 主摄像头 - 渲染3D背景照相机上的物体。Unity中的摄像机有一个名为“剔除遮罩”的设置,您可以在其中设置每个摄像机呈现的图层。还有两个设置:深度和“清除标志”,可用于更改相机渲染顺序。

5.在我们的情况下,需要两个额外的层来正确渲染背景摄像机。从检查器右上角的图层下拉菜单中选择“添加图层”,然后添加2层 - “BackgroundLayer1”和“BackgroundLayer2”,如下所示。不幸的是,当Unity导出K2包时,它不会导出额外的层。这就是在演示场景中缺少额外图层的原因。

Kinect v2 Examples with-SDK 提示 技巧和示例简介_第1张图片

6.添加额外的图层后,选择Hierarchy中的BackgroundImage1对象,并将其图层设置为“BackgroundLayer1”。然后选择BackgroundImage2并将其图层设置为“BackgroundLayer2”。

7.在场景中创建一个摄像头对象并将其命名为BackgroundCamera1。仅将其CullingMask设置为“BackgroundLayer1”。然后将其“Depth”设置为(-2),将“Clear flags”设置为“Skybox”或“纯色”。这意味着相机将首先渲染,将清除输出,然后渲染BackgroundImage1的纹理。不要忘记禁用其AudioListener组件。否则,在控制台中会出现无尽的警告,关于场景中的多个音频监听器。

8.创建第二个相机对象并将其命名为BackgroundCamera2。只将其CullingMask设置为“BackgroundLayer2”,将其“深度”设置为(-1),将其“清除标记”设置为“仅深度”。这意味着这台相机将渲染2nd(因为-1> -2),不会清除之前的相机渲染,而是在其上渲染BackgroundImage2纹理。再次,不要忘记禁用其AudioListener组件。

9.最后,在场景中选择“主摄像机”。将其“深度”设置为0,将“清除标记”设置为“仅深度”。在其“剔除掩码”中禁用“BackgroundLayer1”和“BackgroundLayer2”,因为它们已经被背景摄像机渲染。这样,主摄像机将渲染场景中的所有其他图层,在背景摄像机的顶部(深度:0> -1> -2)。

如果您需要上述设置的实际示例,请查看KinectDemos / BackgroundRemovalDemo / KinectBackgroundRemoval1-demo场景的对象,图层和相机。

如何在非Windows平台上运行演示场景

从K2资产的v2.14开始,您可以在非Windows平台上运行并构建许多演示场景。在这种情况下,您可以使用KinectDataServer和KinectDataClient组件,通过网络传输Kinect正文和交互数据。K2VR资产使用相同的方法。这是做什么:

1.将KinectScripts / KinectDataClient.cs作为组件添加到客户端场景中的KinectController-game对象。它将取代通过网络连接到KinectDataServer-app的传感器的直接连接。
2.在连接了Kinect传感器的机器上,运行KinectDemos / KinectDataServer / KinectDataServer-scene,或者下载相同版本的Unity编辑器的预置KinectDataServer-app,就像运行客户端场景一样。现成的KinectDataServer-app可以在这个页面找到
3.确保KinectDataServer和客户端场景在相同的子网中运行。如果您希望客户端自动发现KinectDataServer的运行实例,则需要这样做。否则,您需要手动设置KinectDataClient组件的“服务器主机”和“服务器端口”设置。
4.运行客户端场景以确保它连接到服务器。如果没有,请检查控制台是否有错误消息。
5.如果客户端和服务器之间的连接正常,并且客户端场景按预期工作,则将其构建到目标平台并在那里进行测试。

如何解决用户跟踪问题,当用户被转回

从K2资产的v2.14开始,您可以(至少粗略地)在用户转回时解决用户跟踪问题。这是做什么:

1.将FaceTrackingManager-component添加到场景中,如果没有的话。正面和背面用户检测需要面部跟踪。
2.启用KinectManager的“允许转弯”设置。KinectManager是所有演示场景中KinectController-game对象的组件。
运行场景来测试它。请记住,此功能只是Kinect SDK中的一个问题的解决方法(不是解决方案)。问题是,通过设计,Kinect只能正确跟踪面向传感器的用户。侧面追踪也不顺畅。最后,这个解决方法是实验性的,可能不适用于所有情况。

如何获得完整的场景深度图像作为纹理

如果您想要获取完整场景深度图片,而不是仅限用户使用的深度图片,请按以下步骤操作:

1.打开Resources / DepthShader.shader并取消注释掉其他部分的'if',你可以在着色器的末尾看到。保存着色器并返回到Unity编辑器。
2.确保KinectManager的“计算用户映射”设置被设置为“用户纹理”。KinectManager是所有演示场景中KinectController游戏对象的组件。
3.如果要在屏幕上查看深度纹理,可以选择启用KinectManager的“显示用户图”(Display user map)设置。
4.您也可以通过在脚本中调用“KinectManager.Instance.GetUsersLblTex()”来获得深度纹理,然后以您想要的方式使用它。

关于AvatarController和AvatarScaler的一些有用的提示

根据用户在Kinect传感器前面的移动,AvatarController组件移动所连接的人形模型的关节。AvatarScaler组件(主要用于试衣间场景)通过高度,手臂长度等方式来缩放模型以匹配用户。下面是关于这些组件的一些有用的提示:

1.如果你需要头像在其初始位置移动,确保其AvatarController的“相对于相机的位置”设置为“无”。
2.如果“相对于相机的位置”代替了相机,相对于该相机的化身的位置将与用户相对于Kinect传感器的位置相同。
3.如果“相对于相机的位置”引用了相机并且“位置相关覆盖颜色”设置也被启用,则头像的三维位置被调整以将用户覆盖在彩色相机上。
4.在最后一种情况下,如果模型也具有AvatarScaler组件,则应该将“前景摄影机” - 将AvatarScaler设置为同一个摄影机。然后缩放计算将基于调整的(重叠的)关节位置,而不是在空间中的关节位置。
5. AvatarScaler的“连续缩放”设置决定了在检测到用户(禁用该设置时)或者连续更新(启用该设置时)时,模型缩放应该只发生一次。

如果你需要头像服从物理和重力,禁用AvatarController组件的“垂直移动”设置。如果已启用,则禁用“接地脚”设置。然后为所有轴(X,Y和Z)启用刚性体分量的“冻结旋转”设置。确保'Is Kinematic'设置被禁用,以使物理控制成为化身的刚体。

如果要停止场景中人形模型的传感器控制,可以删除模型的AvatarController组件。如果要恢复模型的传感器控制,请再次将AvatarController组件添加到人形模型。删除或添加此组件后,请不要忘记调用“KinectManager.Instance.refreshAvatarControllers();”更新KinectManager跟踪的头像列表。

如何设置K2软件包以使用Orbbec Astra传感器(v2.16及更高版本)

1.转到https://orbbec3d.com/develop/并点击“下载Astra驱动程序和OpenNI 2”。这里是快捷方式:http : //www.orbbec3d.net/Tools_SDK_OpenNI/3-Windows.zip
2.解压下载的文件,进入“Sensor Driver”文件夹,运行SensorDriver_V4.3.0.4.exe安装Orbbec阿斯特拉司机。
3.连接Orbbec Astra传感器。如果驱动程序安装正确,您应该在“Orbbec”下的“设备管理器”中看到它。
4.如果安装了Kinect SDK 2.0,请打开KinectScripts / Interfaces / Kinect2Interface.cs并更改'sensorAlwaysAvailable = true;' 在课程开始时“sensorAlwaysAvailable = false;”。关于这个动作的更多信息可以在这里找到
5.运行其中一个头像演示场景来检查Orbbec Astra界面是否工作。传感器应该点亮,用户应该被检测到。


你可能感兴趣的:(kinect,unity)