【翻譯】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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章