LeapMotion(2) 追蹤五指

2022-07-22 04:15:10 字數 3129 閱讀 7542

這篇文章,我們來實現五指的追蹤。

其實,能夠實現一指的追蹤,那麼五指的追蹤自然不成問題。但是,還是有幾個問題我們需要考慮一下。

1、並不是每一幀都會包含五指的全部資訊。

比如,當前幀包含了五指資訊,那麼,視窗上就會顯示五個紅色圓。如果此時使用者握拳,那麼,下一幀就可能只會有一指的資訊。此時,就應從視窗中移除多餘的四個紅色圓。

2、手指如何和紅色圓對應。

因為hand.fingers集合對應的不一定是拇指、食指、中指、無名指、小指(可能對應的是小指、無名指、中指),所以,得想個辦法把某個指尖和某個紅色圓對應起來。幸好,leap為每個物件都定義了id。這樣,我們就可以將指尖的id和紅色圓繫結在一起。自然地,我們會想到用dictionary。

3、如何刪除上一幀有的而這一幀中沒有的紅色圓。

這個問題相對簡單,做乙個list,把這一幀中id一次加進去,然後,再從dictionary的keys裡面刪除那些不在list中的id所對應的紅色圓。

step1:構造下面的使用者介面。

step2:宣告myleaplistener類和視窗closing事件。**和leapmotion(1)中的一樣。

step3:新增成員變數dictionary表示手指id和紅色圓的對應,新增成員變數list表示當前幀追蹤到的手指編號。**如下:

1

private dictionaryellipses;

2private list fingerids;

step4:編寫「連線裝置」的單擊事件和「斷開裝置」的單擊事件。與之前不同的是,在「連線裝置」的單擊事件中,需要初始化ellipses成員變數,在「斷開裝置」的單擊事件中,需要清空ellipses成員變數。

1

private

void connect_device_button_click(object

sender, routedeventargs e)214

15private

void disconnect_device_button_click(object

sender, routedeventargs e)

16

step5:編寫onframeevent事件。還是先放上事件宣告。

1

void listener_onframeevent(object

sender, eventargs e)

2

和之前一樣,在事件中,我們首先要獲取追蹤到的手部的資訊。

1             leapframe frame = controller.frame();//

獲取當前幀

2if (!frame.hands.isempty)//

判斷是否追蹤到手部

3

接下來,就需要找到追蹤到的每乙個指尖(是指尖,而不是筆之類的東西歐)。

1

foreach (finger finger in hand.fingers.where(f =>f.isfinger))

2

獲取指尖id放入list,然後判斷dictionary中是否有指定id對應的ellipse。**如下:

1

//獲取指尖id,放入list

2fingerids.add(finger.id);

34 ellipse ellipse = null;5

if (ellipses.containskey(finger.id))//

如果在dictionary中有,則用ellipse表示其69

else

//dictionary中不存在,則建立乙個ellipse

10), null

);20 }

1

//設定ellipse的位置

2 leapvector position =finger.tipposition;34

double x =position.x;

5double y =position.y;67

double screenwidth =container_canvas.actualwidth;

8double screenheight =container_canvas.actualheight;

910 x = x / detectionwidth * screenwidth + (screenwidth / 2

);11 y = screenheight - y / 600 *screenheight;

1213

this.dispatcher.begininvoke(new action(delegate

14), null);

這樣,我們就完成了指尖位置的繪製。

但是,要記得,在dictionary中可能存在本幀中沒有檢測到的指尖的id。為此,我們需要移除dictionary中那些多餘的key。**如下:

1

//去掉這一幀中沒追蹤到的手指

2 ienumerable deletedids =ellipses.keys.except(fingerids);

3foreach (int id in deletedids.tolist())//

這裡要記得tolist()一下,否則會出現異常。

4), null

);11

12ellipses.remove(id);13}

1415

//完成本次繪製,清空list

16 fingerids.clear();

ok,這樣就完成了。執行程式看看吧。

你會發現,基本上還是我們要的效果。但是,

當手越高,指尖距離越近,這是為什麼呢?考慮一下。

附上源**。

五指棋邏輯, 簡單實現

void initqipan 初始化棋盤 void printqipan 列印棋盤 void pos int x,int y void xiaqi int tonji int x,int y void win 勝利判斷 void zhuobiao void white void black char...

C基礎(五)指標

書目 c程式設計 第三版 表示形式含義a 二維陣列名,指向一維陣列a 0 即0行首位址 a 0 a 0 a 0行0列元素位址 a 1,a 1 1行首位址 a 1 a 1 1行0列元素a 1 0 的位址 a 1 2,a 1 2,a 1 2 1行2列元素a 1 2 的位址 a 1 2 a 1 2 a 1...

c 指標(五) 指標的指標

int p 這定義了乙個什麼指標呢?不急不急,慢慢來分析 int a 上條語句我們定義了乙個整型變數 a 首先,我們不妨把 p 和 a 模擬一下,那麼 p 就是乙個整型變數,我們不妨叫這個整型變數 target 按照位址找下去,最終找到的實實在在的int型變數 由於 p target,同時 p p,...