向Lord_Rebel要了转载权,TA翻译了10篇文章,就像我以前翻译c++。十分感谢她的努力,我全部转载到这里方便大家阅读。
【翻译】Leapmotion-python开发官方文档(1)
【翻译】Leapmotion-python开发官方文档(2)
【翻译】Leapmotion-python开发官方文档(3)
【翻译】Leapmotion-python开发官方文档(4)
【翻译】Leapmotion-python开发官方文档(5)
【翻译】Leapmotion-python开发官方文档(6)
【翻译】Leapmotion-python开发官方文档(7)
【翻译】Leapmotion-python开发官方文档(8)
【翻译】Leapmotion-python开发官方文档(9)
【翻译】Leapmotion-python开发官方文档(10)
(介于本人翻译能力有限,如有错误,望指出)
Hands
手是LeapMotion控制器所追踪的最基本的实体。控制器内部保持着一个手部模型,以此来验证从其传感器收集到的数据。这就能够使得即使一个手指没有完全可见,控制器仍能追踪到其位置。注意,当一个手指在手的后方或者正前方(以控制器的视野)时移动或者发生改变时其位置可能会发生丢失。LeapMotion软件会将现实数据与内建模型进行匹配。在某些情况下,软件可能产生一个错误的匹配——比如,将左手错认成右手。
Hand类代表一个被LeapMotion检测到的手部对象。Hand对象提供Pointables列表以及描述手位置,运动,方向的属性。
手象可以被定义成左手以及右手。此外,每个手部对象第一次被检测到时都会分配一个ID值(使用timeVisible属性判断一只手是不是刚刚探测到。)如果LeapMotion软件认为一只手被错误分类或者必须改变其类型(从左手变成右手或者相反)也会重新分配一个新的ID值。
获取手对象
从Frame对象中获得Hand对象。
1 2 3 |
frame = controller.frame() # controller is a Leap.Controller object hands = frame.hands first_hand = hands[0] |
或者如果你已经从之前的数据帧中知道了相关ID
1 |
known_hand = frame.hand(hand_ID) |
你也可以通过手在数据帧的相对位置来获得它。
1 2 3 4 5 6 |
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对象并访问其基本的属性:
1 2 3 4 |
hand = frame.hands.rightmost position = hand.palm_position velocity = hand.palm_velocity direction = hand.direction |
获得手指对象
你可以以列表形式或者使用相应的ID获得与手关联的手指对象。
通过列表形式:
1 2 3 |
# hand is a Leap.Hand object pointables = hand.pointables fingers = hand.fingers |
通过ID:
1 |
known_pointable = hand.pointable(pointable_ID) |
通过在LeapMotion视野中的相对位置获得手指对象,使用相关的类列表中的right-,left-以及frontmost函数:
1 2 3 4 |
# 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)
1 2 3 |
pitch = hand.direction.pitch yaw = hand.direction.yaw roll = hand.palm_normal.roll |
注意 roll函数在法相向量的使用中只会提供理想的角度。
将手指坐标变换到手参考系下
有些时候得到手指相对于手参考系下的坐标是十分有用的。这能让你在空间上处理手指位置简化对手指位置的分析。你可以使用Matrix类创建一个用于变换手指位置和方向的变换矩阵。以手为参考系的坐标系可由手的basis和palm_position属性轻松定义。基本坐标轴x轴从手掌侧面穿过,z轴指向手指方向,y轴平行于手掌法线,原点在手掌中心。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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获得的手列表是只读的,但你可以组合拥有相同对象类型的列表。
使用迭代器访问一个列表类。
1 2 |
for hand in handList: print hand |
HandList类还定义了一些用于基于Leapmotion坐标系下相对位置访问列表成员的函数。这些函数包括leftmost(), rightmost(), 和frontmost()。以下代码段展示如何获得最右边的手对象
1 |
furthest_right = frame.hands.rightmost |