• 沒有找到結果。

5-1 手指偵測方法

在文檔中 中 華 大 學 碩 士 論 文 (頁 48-53)

以下是實作手指偵測的引用, 其中,要能偵測手指, 首先要從手指輪廓辨識開始。

而後依照手部幾何上的特性找出手指及手掌部位,以下為辨識的步驟:第一步就是先找 出手部輪廓的前級搜尋處理。透過 kinect 深度影像的深度值,可以判讀每個像素點是 否落在特定的近距離內,由 yes or no,可得到影像二值化後的形狀。

實驗設定:

settings.nearSpacePerc = 0.05

像素點的深度距離若 <= (最遠距離 – 最近距離) X settings.nearSpacePerc 而且 不等於 -1 為 true

38

這二值化的像素點可進一步做雜訊除去處理, 分別是用到形態學的 Dilate 與 Erode 原 理使得手部影像更為平滑。接著將這二值化的點作分類,判定是否是屬於手部分的有 效點,若是此點的鄰近四點(上下左右)都是有效點, 則此點屬於內部區; 若此點的鄰 近點有任何一點是無效的點, 則此點為 Contour 點。而且產生三種資訊,分別為內部點 InsidePoint,邊界點 ContourPoint 表,及空心的 Contour 陣列。

由於大部分的人慣用右手, 所以上述的分類與排序, 採用右上方,由右而左與循序往 下進行,並產生出上述三種資訊 ;

39

接下來, 要進行手的輪廓辨別認定 , 所採用的方法是 Turtle Algorithm 搜尋 方格方式,將前述 Contour 影像矩陣中,依據 ContourPoint 表找出可能是手部特徵的 初 始 位 置 並 排 序 這 些 點 為 特 定 手 的 ContourPoint 點 判 斷 所 找 到 的 手 的 ContourPoint 輪廓是否為有效的手部 ContourPoint 輪廓,判斷依據是: 這個所找到 的 ContourPoint 輪廓點 需占總 Contour 點 20% 以上, 且同時此點數必須大於 22 以上, 才視為該需要處理的有效資訊。

下圖為 Turtle Algorithm 尋找及排序 Contour 點示意圖及說明[24]。

圖 5-1 Turtle Algorithm 尋找及排序 Contour 點示意圖

1

圖 5-2 Turtle Algorithm 尋找 Contour 判別式 1 2

1

1

1

0 2

1

1

3

1

1

0 2

1

1

1 2

1

1

1 0 2

1

1

3

1

0 1

2

1

1

方向:

有像素值: dir = 0;

dir = (dir + 1) % 4;

無像素值:

dir = (dir + 4 - 1) % 4;

dir: 0 Down

1 Right

2 Up

3 Left

40

在以下 CalculateFrontier 函式中, 收集到的 contour 輪廓點會透過 陣列 list 傳回至呼 叫函式。

第二步做 blob detection:依照手部幾何上的特性找出手掌部位及手指尖,首先先找出手 掌心的座標位置: 先計算個別手輪廓的最左上與最右下角的座標位置並調整一個參 數後往右下移動。

圖 5-3 手輪廓邊界右下移動示意圖

41

接下來, 將 insidePoint 點分配到個別手去, 其判斷依據即是否在個別手的輪廓的最 左上與最右下角的座標位置範圍內。 而後進行手掌心位置點的演算搜尋,搜尋方法:

依據圓內最長的距離是通過圓心的直徑,所以手掌心是所有個別手的內部點到達 contour 點 最短距離中的最長距離。

圖 5-4 手心為手掌的內切圓心(取自文獻[4])

接下來, 找出手指尖:

這裡採用曲率計算,來進行各輪廓點的曲率的曲率計算,通常指尖與凹陷處會位於 與左右鄰點曲率變化較大之處,所以利用類似走迷宮方式的演算法,追蹤觀察 edge 上 個別點,對這些個別點分別從兩邊沿邊緣走 22 個點,因此每個點會有一個起點和兩 個終點,三點可形成一夾角。接著利用兩線段的向量求出此一夾角的 cosθ

曲率的計算公式為:

圖 5-5 手部尖點角度計算

當曲率變化值小於某個臨界值時,代表此輪廓點可能是輪廓過度突起處的指尖凹陷處。

本實作在指尖判定設定之依據參數為:

42

• theta = 40 * (Math.PI / 180); // In radians k = 22;

且 Fь 與 Ff 之中間點到手掌的距離要小於 Fm 點至手掌的距離。

為減少指尖偵測運算所需耗的時間, 而且目標物為手指, 所以可以大膽的設定, 當指尖被找到後,可直接跳開一定比例的點(實驗中為 0.1 * 此手的總輪廓點數), 繼 續搜尋, 且非逐一而是跳二方式進行搜尋:

size = hands[i].contour.Count;

jump = (int) (size * settings.fingertipFindJumpPerc);

在文檔中 中 華 大 學 碩 士 論 文 (頁 48-53)

相關文件