【翻译】Leapmotion-python开发官方文档(4)

Hands

手是LeapMotion控制器所追踪的最基本的实体。控制器内部保持着一个手部模型,以此来验证从其传感器收集到的数据。这就能够使得即使一个手指没有完全可见,控制器仍能追踪到其位置。注意,当一个手指在手的后方或者正前方(以控制器的视野)时移动或者发生改变时其位置可能会发生丢失。LeapMotion软件会将现实数据与内建模型进行匹配。在某些情况下,软件可能产生一个错误的匹配——比如,将左手错认成右手。
Hand类代表一个被LeapMotion检测到的手部对象。Hand对象提供Pointables列表以及描述手位置,运动,方向的属性。
手象可以被定义成左手以及右手。此外,每个手部对象第一次被检测到时都会分配一个ID值(使用timeVisible属性判断一只手是不是刚刚探测到。)如果LeapMotion软件认为一只手被错误分类或者必须改变其类型(从左手变成右手或者相反)也会重新分配一个新的ID值。

获取手对象

从Frame对象中获得Hand对象。

frame = controller.frame() # controller is a Leap.Controller object
hands = frame.hands
first_hand = hands[0]
或者如果你已经从之前的数据帧中知道了相关ID

known_hand = frame.hand(hand_ID)
你也可以通过手在数据帧的相对位置来获得它。

frame = controller.frame() # controller is a Leap.Controller object
hands = frame.hands

leftmost = hands.leftmost
rightmost = hands.rightmost
frontmost = hands.frontmost
注意,leftmost和rightmost函数只会判断处于最左或者最右边的手使用Hand.isLeft 或者isRight属性判断手对象代表右手还是左手。

获得手的属性

一只手由其位置,方向,姿势,运动以及左右手性质描述:
isRight,isLeft——定义手是左手还是右手。
Palm_Position——手掌中心左标(单位:毫米,以LeapMotion坐标系)
Palm_Velocity——手掌的运动速度及方向(毫米每秒)
Palm_normal——一个垂直于手掌平面的向量。(手掌平面法线),向量朝下穿出手掌。
Direction——一个从手掌中心指向手指方向的向量。
grabStrengh,pinchStrength——描述手的姿势。
Motion_factors——提供相对缩放,旋转,平移因子(从两帧之间的运动中比对而出)
手的位置基于其手掌位置属性,手掌位置属性提供一个基于Leap坐标系的手掌中心点坐标(三维,单位:毫米)。手的方向由两个向量决定:朝向,从手掌中心指向手指的向量;手掌法线,方向向下穿过手掌并与手掌平面垂直。
手掌的运动由速率属性给出,速率属性是一个提供实时移动速率(mm/s)的向量。你也可以获得表征手在两帧之间的运动的(平移,翻转,缩放)运动因子。

下面代码段展示了如何从帧中获得Hand对象并访问其基本的属性:

hand = frame.hands.rightmost
position = hand.palm_position
velocity = hand.palm_velocity
direction = hand.direction

获得手指对象

你可以以列表形式或者使用相应的ID获得与手关联的手指对象。
通过列表形式:
# hand is a Leap.Hand object
pointables = hand.pointables
fingers = hand.fingers
通过ID:
known_pointable = hand.pointable(pointable_ID)
通过在LeapMotion视野中的相对位置获得手指对象,使用相关的类列表中的right-,left-以及frontmost函数:
# hand is a Leap.Hand object
left_pointable = hand.pointables.leftmost
right_finger = hand.fingers.rightmost
front_finger = hand.fingers.frontmost
注意,这些函数都是以Leapmotion坐标系为参考系的,而不是手本身的参考系。你可以使用Leap中的Matrix类将手指坐标变换到手掌坐标系中。

计算手方向

你可以使用手的朝向及法相向量计算手的方向。
法线向量垂直穿出手掌,朝向向量指向手指。
Vector类提供了一些函数来获得与x轴的夹角(pitch)、与y轴的夹角(yaw)、与z轴的夹角(roll)
pitch = hand.direction.pitch
yaw = hand.direction.yaw
roll = hand.palm_normal.roll
注意 roll函数在法相向量的使用中只会提供理想的角度。

将手指坐标变换到手参考系下

有些时候得到手指相对于手参考系下的坐标是十分有用的。这能让你在空间上处理手指位置简化对手指位置的分析。你可以使用Matrix类创建一个用于变换手指位置和方向的变换矩阵。以手为参考系的坐标系可由手的basis和palm_position属性轻松定义。基本坐标轴x轴从手掌侧面穿过,z轴指向手指方向,y轴平行于手掌法线,原点在手掌中心。
frame = controller.frame()
for hand in frame.hands:
    hand_x_basis = hand.basis.x_basis
    hand_y_basis = hand.basis.y_basis
    hand_z_basis = hand.basis.z_basis
    hand_origin = hand.palm_position
    hand_transform = Leap.Matrix(hand_x_basis, hand_y_basis, hand_z_basis, hand_origin)
    hand_transform = hand_transform.rigid_inverse()

    for finger in hand.fingers:
        transformed_position = hand_transform.transform_point(finger.tip_position)
        transformed_direction = hand_transform.transform_direction(finger.direction)
        # Do something with the transformed fingers

手列表

Handlist类看起来像std::vector数组(C++ STL)同时支持迭代器。从LeapMotion API获得的手列表是只读的,但你可以组合拥有相同对象类型的列表。
使用迭代器访问一个列表类。
for hand in handList:
    print hand
HandList类还定义了一些用于基于Leapmotion坐标系下相对位置访问列表成员的函数。这些函数包括 leftmost(), rightmost(), 和 frontmost()。以下代码段展示如何获得最右边的手对象
furthest_right = frame.hands.rightmost

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值