天天看点

Gesture类(Leap::Gesture)和GestureList类(Leap:: GestureList)

Gesture类(Leap::Gesture)

这个类代表了识别的用户的动作。Leap Motion控制器在它的视线内看到并识别的一些运动模式,都是用户典型的手势。比如,手从一边到另一边的移动表明是挥动的手势,而手指向前戳则是点击屏幕的手势。

当软件识别一个手势,会给其分配一个ID,并在那个帧手势列表中加入一个Gesture对象。对于连续的手势,也就是会在很多帧中出现,软件会通过加入具有同样ID的Gesture对象来更新手势。

注意,识别每种类型的手势,需要用Controller::enableGesture()来打开使能“开关”,否则将没法识别。如下:

controller.enableGesture(Leap::Gesture::TYPE_CIRCLE);

controller.enableGesture(Leap::Gesture::TYPE_KEY_TAP);

controller.enableGesture(Leap::Gesture::TYPE_SCREEN_TAP);

controller.enableGesture(Leap::Gesture::TYPE_SWIPE);

值得一提的是,Gesture还有四个子类,定义了几种被Leap Motion识别的指定的运动模式的属性。如下:

CircleGesture表示一根手指画圈的运动;

SwipeGesture表示手和扩展的手指的直线运动;

ScreenTapGesture表示一根手指向前点击的运动;

KeyTapGesture表示一根手指向下点击的运动。

其中画圈和挥动的手势是连续的,这些对象有一个开始、更新和停止的状态。屏幕点击的手势是个离散的手势软件只能在每次点击时创建一个单独的ScreenTapGesture对象,而且总是有一个停止的状态。

要从Frame对象中得到有效的Gesture对象,可以通过Frame::gestures()来得到一个手势的列表,可以通过Frame::gestures(const Frame&)来得到一个自某个指定帧开始的手势的列表,可以通过Frame::gesture()来用前一帧得到的ID值在当前帧中找到一个手势。

Gesture对象也可以是无效的。比如,当你通过Frame::gesture()用ID值得到一个手势,在当前帧中并没有带有这个ID的手势,则这个函数就会返回一个无效的Gesture对象(而不是一个空的值)。需要经常在可能手势无效的情况下检测对象的有效性。

下面的keys可以用来结合Config类来配置手势识别器:

Gesture类(Leap::Gesture)和GestureList类(Leap:: GestureList)

enum Type: 表示手势支持的类型。如下:

TYPE_INVALID==-1表示一个无效的类型;

TYPE_SWIPE==1表示手和扩展的手指的直线运动;

TYPE_CIRCLE==4表示手指的画圈运动;

TYPE_SCREEN_TAP==5表示一根手指向前点击的运动;

TYPE_KEY_TAP==6表示一根手指向下点击的运动。

enum State: 表示可能的手势的状态。如下:

STATE_INVALID==-1表示一个无效的状态;

STATE_START==1表示手势正在开始,足够被识别;

STATE_UPDATE==2表示这个手势正在进行中(并不是所有的手势都有这个过程);

STATE_STOP==3表示这个手势已经完全结束。

int64_t duration(): 表示识别运动直到包含这个Gesture对象的帧的持续时间(微秒)。在序列中记录第一个Gesture对象的持续时间会是个很小的正值,因为运动进行的必须足够程度,使得软件可以把它识别为一个有意的手势。

float durationSeconds(): 表示持续时间(秒)。

用法:float seconds=gesture. durationSeconds();

Frame frame(): 表示包含这个Gesture实例的Frame对象。返回的是父类Frame对象。

用法:Leap::Frame frameOfGesture=gesture.frame();

Gesture(): 构造一个无效的Gesture对象。没有初始化的Geature对象被认为是无效的。从Frame对象中得到Gesture类的有效的实例,将会成为一个子类。

Gesture(const Gesture & rhs): 表示构造一个Gesture对象的一个新的复制。

用法:Leap::Gesture copy=Leap::Gesture(gesture);

HandList hands(): 代表与这个对象相关联的的手的列表。如果没有与这个手势关联的手,则该列表为空。

用法:Leap::HandList handsForGesture=gesture.hands();

int64_t id(): 代表手势的ID。属于同一个识别的运动的所有Gesture对象具有同样的ID值。可以通过Frame::geature()利用这些ID值在连续帧中找到关联这个对象的更新。

bool isValid(): 判断这个Gesture实例是否代表一个有效的Gesture对象。如果这是一个有效的Gesture实例,返回True。

bool operator!=(const Gesture &): 比较Gesture对象是否不相等。如果两个对象都是有效的,在同一帧中有且仅有这两个对象表示同样的实体,则这两个对象相等。

用法:thisGesture!=thatGesture;

bool operator==(const Gesture &): 比较Gesture对象是否相等。如果两个对象都是有效的,在同一帧中有且仅有这两个对象表示同样的实体,则这两个对象相等。

用法:thisGesture==thatGesture;

PointableList pointables(): 代表与这个手势关联的手指和工具的列表。如果没有与这个手势相关联的Pointable对象,这个列表是空。

用法:Leap::PointableList pointableForGesture=gesture.pointable();

State state(): 表示手势的状态。识别的运动随着时间出现,有开始,中间和结束。这个属性就记录了在序列中这个Gesture对象的起伏。返回一个在State枚举中的一个成员。

std::string toString(): 一个包含简略描述该Gesture对象的字符串。

Type type(): 表示这个手势的类型。返回的是Gesture::Type枚举类型中手势的类型。

用法:Leap::GestureList gestures = frame.gestures();

for (Leap::GestureList::const_iterator gl = gestures.begin(); gl != frame.gestures().end(); gl++)

{

switch ((*gl).type()) {

case Leap::Gesture::TYPE_CIRCLE:

//Handle circle gestures

break;

case Leap::Gesture::TYPE_KEY_TAP:

//Handle key tap gestures

break;

case Leap::Gesture::TYPE_SCREEN_TAP:

//Handle screen tap gestures

break;

case Leap::Gesture::TYPE_SWIPE:

//Handle swipe gestures

break;

default:

//Handle unrecognized gestures

break;

}

}

const Gesture & invalid(): 返回一个无效Gesture对象。还是用来判断对象是否有效。

GestureList类(Leap:: GestureList)

这个类代表了Gesture对象的列表。通过调用Frame:: gestures()可以得到一个GestureList对象。

GestureList & append(const GestureList & other): 表示把指定的一个GestureList的成员添加到这个GestureList对象中。参数other表示一个GestureList对象,其中包含Gesture对象,将要添加到这个GestureList对象末端。

const_iterator begin(): 表示C++的迭代器,设置在这个GestureList对象的开始。

用法:Leap:: GestureList tools = frame. gestures();

for (Leap:: GestureList::const_iterator gl = gestures.begin(); gl != gestures.end(); gl++)

std::cout << *gl << std::endl;

int count(): 表示这个列表中手势的数目。

const_iterator end(): 表示C++的迭代器,设置在这个GestureList对象的结束。

用法:Leap:: GestureList tools = frame. gestures();

for (Leap:: GestureList::const_iterator gl = gestures.begin(); gl != gestures.end(); gl++)

std::cout << *gl << std::endl;

GestureList(): 表示构造一个没有实体的空列表。

bool isEmpty(): 判断这个列表是否为空。如果没有成员,返回True。

Gesture operator[](int index): 表示对列表中一个成员位置的访问。返回的是指定索引下的Gesture对象。

用法:Leap::GestureList allGestures = frame. gestures();

Leap::Gesture firstGesture = allGestures[0];

译自:https://developer.leapmotion.com/documentation/cpp/api/Leap.Gesture.html

https://developer.leapmotion.com/documentation/cpp/api/Leap.GestureList.html

继续阅读