Unity

开发环境搭建

Orbbec Pose Unity SDK支持Unity 2018.4及以上版本,支持的平台包括Windows x64和Zora P1 Android 9。

  1. 首先需要从 Unity官方网站 下载并安装Unity

  2. 接下来在我们的 3D视觉开发者社区 下载最新版本的Orbbec Pose Unity SDK

  3. 解压下载下来的SDK包,可以看到里面包含以下内容:

    ../_images/unity_folder.png
    • OPose-tools文件夹包含Android和Windows平台的算法演示工具

    • OPose-doc.zip中包含算法说明文档

    • OPose-SDK.unitypackage文件是Orbbec Pose Unity SDK包

接入说明

在安装完cuda、cuDNN以及TensorRT后需要重新启动电脑或者UnityHub,否则会出现找不到obt.dll的情况

要使用Orbbec Pose Unity SDK,首先需要导入OPose-SDK.unitypackage到Unity工程中,导入后可以看到在Assets中包含以下目录:

../_images/Unity_Assets.png
  • Astra文件夹中包含和Astra SDK相关的内容,用于Astra Plus和Astra Mini设备的控制和取流操作

  • Orbbec文件夹中包含和Orbbec SDK相关的内容,用于Astra+和Femto设备的控制和取流操作

  • OrbbecPose文件中包含骨架算法相关内容,用于骨架识别:

    ../_images/Unity_Pose_folder.png
    • Plugins文件夹中包含各个平台的算法SDK库

    • Sample文件夹中包含基本的使用示例

    • Scripts文件中包含主要的组件

    • Tools文件夹中包含演示算法主要功能的工具

Orbbec Pose Unity SDK已经将算法的功能都封装成组件,只需要将以下组件挂在到场景中的物体上就可以使用Orbbec Pose SDK的所有功能:

../_images/Unity_StreamManager.png

StreamManager组件用于获取设备的数据流,可以选择基础SDK的类型,包括Astra SDK和Orbbec SDK,以支持不同类型的相机

../_images/Unity_PoseManager.png

PoseManager组件用于获取算法生成的骨架结果,使用的时候需要先设置一组License(获取方式参考 授权方式 ),还可以设置骨架的跟踪模式,包括Single模式、Double模式和All模式,以及骨架的处理模式是2D模式还是3D模式

注意:Windows平台编译时Architecture需要选择x86_64,Android平台编译时Minimum API Level需要选择API level 23及以上,Target API Level建议选择API level 26,Target Architectures仅勾选ARMv7

SDK使用示例

判断初始化是否成功

//判断算法SDK是否初始化成功
PoseManager.HasInitialized();

骨架识别开关

//设置骨架识别开关
PoseManager.EnableBody(true);
//判断骨架识别是否打开
PoseManager.IsBodyEnable();

获取骨架数据

//获取深度骨架数据
PoseManager.GetDepthBodyList()
//获取彩色骨架数据
PoseManager.GetColorBodyList()

此外,还可以通过回调方式获取骨架数据

//监听回调事件
PoseManager.onBodyFrame += OnBodyFrame()
//处理回调帧,获取骨架数据
void OnBodyFrame(Frame bodyFrame)
{
    bodyFrame.GetColorBodyList();
    bodyFrame.GetDepthBodyList();
}

获取骨架点坐标

bodyList = PoseManager.GetDepthBodyList();
if (bodyList.bodyNum > 0)
{
    //遍历bodyList获取每个body
    for (int i = 0; i < bodyList.bodyNum; i++)
    {
        var joints = bodyList.body[i].joints;
        //遍历joints获取每个关节点的坐标
        for (int i = 0; i < joints.Length; ++i)
        {
            var jointPos = joints[i].position;
        }
    }
}