SharpNow Vidoo SDK  2.02
微动开发指南

概述

SDK可用于在多种语言环境中开发微动的应用程序。在进行开发时,您可以通过加载动态链接库,获取设备的感知数据。 SDK的动态链接库使用C语言实现,并使用多种结构体描述手掌与手指的姿态。C++ C# Java等语言的接口为C结构的封装,同名接口具有相同的功能。

获取设备感知信息

应用程序以帧为单位获取微动的感知信息,每一帧数据包括帧信息、多个手指目标的信息、以及多个手掌目标的信息,SDK为各种数据结构提供了访问接口。

加载帧数据

加载

开发者可通过反复调用 sharpnow::RetrieveFrame(int device) 加载指定设备的最新感知信息。该接口调用后, 您可以使用各接口获取用于描述感知信息的结构体,在下一次调用 RetrieveFrame 之前,其他接口的调用, 不会改变任何感知数据。若应用运行中,设备USB线被拔出,则 RetrieveFrame 返回失败。
以下代码为加载感知数据的常规流程:

{
const Frame* frame = GetFrameInfo();
// ...
}
else
{
std::cout << "提示:设备已拔出" << std::endl;
return -1;
}

更新检查

若开发者调用接口的速度,超过设备生成数据的速度,RetrieveFrame 仍可以正常调用,但并不会获得数据更新, 可以通过查询 Frame 中的 updated 成员检查该状态,保证只对最新数据进行处理:

{
const Frame* frame = GetFrameInfo();
if (frame->updated)
{
// 处理最新数据 ...
}
::Sleep(1);
}

连接多台设备

微动支持多台设备同时连接在同一台主机,参数device用于指定从哪台设备进行数据加载,以下代码将从连接PC的二台微动中依次获取数据。 目前,通过指定设备序号,最多可以访问三台微动设备。0与1分别代表先后连接在PC上的两台微动,2代表网络虚拟微动。

{
// ...
}
{
// ...
}
注解
多台设备的感知信息,需使用串行方式依次获取,多线程并行获取可能导致数据不一致的发生。

数据结构

微动SDK以结构体作为信息传递的基本数据结构,各种编程语言下获取的数据信息,通过对C结构体的封装加以实现。

帧描述

结构体 Frame 内包含了每一帧数据的基本描述信息。使用 sharpnow::GetFrameInfo 接口可获取该结构体指针。
帧描述中包括如下信息:

手掌目标

结构体 Hand 内包含了对于单个手掌的识别信息。使用 sharpnow::GetHand 接口可获取指定手掌的结构体指针。
手掌目标中包括如下信息:

手指目标

结构体 Finger 内包含了对于单个手指的识别信息。使用 sharpnow::GetFinger 接口可获取指定手指的结构体指针。
手指目标中包括如下信息:

申请标识

微动每一帧的感知数据中,包括当前帧的描述信息,0至2个手掌目标的信息,0-10个手指目标的信息。 为了便于描述数据手掌与手指之间的拓扑关系,SDK中使用申请标识 Request 对各种数据结构进行索引,使用不同的申请标识可以满足不同的访问需求。
Frame 中的申请标识用于全局遍历访问所有的手掌目标与手指目标,例如:

Hand 中的申请标识用于遍历访问指定手掌的所有手指目标,例如:

Finger 中的申请标识用于访问手指对应的手掌目标,例如:

注解
当访问的目标不存在时,将返回NULL指针。请开发者进行判断与检测,避免出现指针错误。

帧数据范例

下图示例了在一帧数据中包含的各数据结构:

frame.png
帧数据

范例中,帧描述表示当前感知数据包含2个手掌目标与10个手指骨架目标,第一只手掌上有四个 伸出的手指目标,第二只手掌上有三个伸出的手指目标。实线部分为骨架的索引关系,虚线部分为伸开手指的索引关系 使用不同的申请标识可以分别访问这些手掌与手指目标。
以下代码将遍历当前帧的所有手掌与手指:

const Frame* frame = GetFrameInfo();
for (int h = 0; h < frame->hand_number; ++h)
{
const Hand* hand = GetHand(frame->hand[h]);
for (int f = 0; f < hand->finger_skeleton_number; ++f)
{
const Finger* finger = GetFinger(hand->finger_skeleton, f);
// ...
}
for (int f = 0; f < hand->finger_stretched_number; ++f)
{
const Finger* finger = GetFinger(hand->finger_stretched, f);
// ...
}
}


上一章: 微动功能概述
下一章: 手部识别