Kinect for Unity3D開發 之 手勢/姿勢(Gesture)識別基礎知識


  1. 手勢/姿勢識別:

有兩種方法可以為Unity項目添加手勢檢測和手勢識別功能。

1. KinectManager,示例場景中MainCamera的一個組件。

2. 以編程方式指定用戶特定的姿勢。需要實現KinectGestures.GestureListenerInterface。KinectScripts / Extras / SimpleGestureListener.cs腳本中有一段示例。

(沒有這個腳本的下載 用於Unity3D的Kinect Wrapper Package

 

已有的Gesture

RaiseRightHand / RaiseLeftHand - 左手或右手在肩膀上抬起,保持不變至少1.0秒。

Psi - 雙手抬起肩膀,保持這個姿勢1.0秒。

Tpose - 雙臂張開,垂直於身體(T形姿勢),持續1.0秒。

Stop - 一只手向下(down),另一只手略微在腰部以下的位置抬起(slightly to the side)。

Wave - 右手向左揮動然后向右揮動,或左手向右揮動然后向左揮動。

SwipeLeft - 右手向左滑動。

SwipeRight - 左手向右滑動。

SwipeUp / SwipeDown - 用左手或右手向上或向下滑動

Click - 左手或右手保持至少2.5秒。與光標控制結合使用很有用。

RightHandCursor / LeftHandCursor - 偽手勢,用於移動右手或左手提供光標。

ZoomOut - 開始時,左手和右手位於前面並在放在一起,然后朝着不同的方向移動。

ZoomIn - 開始時,左手和右手相距至少0.7米並且位於前方,然后雙手互相靠近。

Wheel - 開始時,左手和右手放在與肩寬的地方,並且在身體前面,然后是手開始轉動一個假想中的輪子,向左(正角度)或向右(負角度)。

Jump - 臀部中心在1.5秒內至少比之前高出15厘米。

Squat - 臀部中心在1.5秒內至少比之前低15厘米。

Push - 在1.5秒內用左手或右手向前推。

Pull - 在1.5秒內向后拉用左手或右手往后拉。

 

第二種方法

UserDetected()用於啟動手勢檢測。

UserLost()用於清除變量或釋放分配的資源。

UserDetected() remove the gestures,不被需要,在調用UserLost()之前,它們會自動刪除。

GestureInProgress() - 繼續,在gesture已經被啟動,但是沒有完成,也沒有被取消時用。

GestureCompleted() 完成后調用。

然后就可以添加自己的代碼,用來處理已完成的gesture。

GestureCancelled() 手勢被取消時使用。

 

如何添加自己的手勢:

傳感器報告Kinect坐標系中被跟蹤的身體部位的三維坐標,以米為單位。

打開 Assets / KinectScripts / KinectGestures.cs

  1. 找到 Gestures-enum,在末尾加上你要添加的手勢名稱
  2. 找到 CheckForGesture()-function,有一個很長的switch(),每個case處理一個手勢的檢測,給你的手勢添加一個case。
  3. 參考RaiseLeftHand,RaiseRightHand,SwipeLeft或SwipeRight 這些簡單的實例。
  4. 這個switch用來檢查和改變gesture現在的狀態,狀態存在GestureDate這個結構體中,所以為你的手勢創建一個GestureDate。
  5. 初始狀態是0。在這個狀態下,代碼才檢測用戶是否在做這個手勢。先檢查關節的位置;如果位置合適,再檢查下一個狀態,是否關節到達所需位置,或與前一個狀態的位置的之間的距離(注意這里是兩種情況,1.與身體其他位置相比較,2.與自己之前的某一個時間點相比較),時間間隔通常假設1~1.5s。
  6. 如果關節位置符合,則認為手勢完成,此時將狀態重置為0以便下一次檢測。最好參考已有的例子,復制修改一下不容易錯。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM