定義1 手勢缺陷圖是指由手勢輪廓線外接多邊形以及多邊形各條邊所對應的谷底( depth point) 所組成的特征描述方程。谷底是指外接多邊形的邊與該邊所對應的輪廓線上距離邊最遠的輪廓點。定義手勢缺陷圖的數據結構如下:
Typedef struct CvConvexityDefect{
CvPoint* start; / /缺陷開始的輪廓點
CvPoint* end; / /缺陷結束的輪廓點
CvPoint* de pth_point; / /缺陷中距離凸性最遠的輪廓點
Float depth; / /谷底距離凸性的深度
} CvConvexityDefect;
如圖4 所示,手勢輪廓缺陷圖能很好地描述各種手勢,通過對手勢輪廓線外接多邊形的邊數以及邊所對應的谷底深度,可以將手勢缺陷圖映射到不同的手勢。其中A、B、C、D、E、F、G為手勢輪廓線的外接多邊形的各條邊,Da、Db、Dc、Dd、De、Df、Dg為手勢缺陷圖中的谷底到對應邊的深度。
為了得到手勢輪廓缺陷圖,首先必須對手勢輪廓進行多邊形擬合,得出它的外接多邊形。本文提出了一種根據手勢輪廓上相鄰兩點間的凹凸性來進行擬合,通過一次遍歷輪廓上的點,對以下方程進行判定,將適當的點剔除,剩下的點即為外接多邊形的候選定點:
by = next y - cur y ( 1)
ay × bx - ax × by ( 2)
ax = pcur. x - pprev. x,ay = pcur. y - pprev. y
bx = pnext. x - pcur. x,by = pnext. y - pcur. y
其中: pcur 為當前遍歷的輪廓線上的點; pprev、pnext 分別表示當前點的前一個點和后一個點; ax、ay 分別為當前點和前一點的x 和y 坐標值差; bx、by 分別為當前點和后一點指尖的x 和y坐標值差。
基于輪廓線凹凸形的擬合算法流程如下:
a) 將所有的輪廓線上的點按x 坐標值大小排序,并找出所有的點中y 坐標的最大最小值maxY 和minY.
b) 將排序后的輪廓點劃分為四部分: 首先按照y 坐標將輪廓線分為上下兩個部分,將上半部分以maxY 所在的x 坐標( 記為Xmaxy) 劃分為兩個部分,分別記為topLeft〈左上〉和topRight〈右上〉; 將下半部分以minY 所在的x 坐標( 記為Xminy) 劃分為兩個部分,分別記為bottomLeft〈左下〉和bottom-Right〈右下〉。
c) 分別對前一步劃分的四個部分( topLeft, topRight,bottomLeft,bottomRight) 進行遍歷: 對區域topLeft 將滿足式( 1) <0,式( 2) > 0 的點剔除; 對區域TopRight 將滿足( 1) < 0,式( 2)< 0 的點剔除; 對區域bottomLeft 將滿足式式( 1) > 0,式( 2) >0 的點剔除; 對區域bottomRight 將滿足式( 1) > 0,式( 2) > 0 的點剔除。剔除后剩下的點即為手勢輪廓線外接多邊形的頂點。
手勢缺陷圖的谷底以及谷底深度的求解是建立在擬合外接多邊形基礎上,還需要對外接多邊形的每條邊所對應的輪廓線再進行一次遍歷,并將滿足以下方程的最大值求出即是該邊所對應的谷底:
?
?
其中: scale 為單位化量值; hull_cur 和hull_next 分別為外接多邊形當前遍歷的邊和下一條邊; dx0、dy0分別為外接多邊形當前邊的x 和y 坐標的差值; dx、dy 分別為當前遍歷的輪廓線上的點與hull_cur 點之間x 和y 坐標的差值; depth 為遍歷點與對應邊之間的距離,它的最大值即為該邊對應的谷底深度,相應的點為谷底。
通過以上搜索可以將手勢輪廓缺陷圖的特征值找出來,接下來便可以將缺陷圖的特征值( 多邊形與谷底的關系) 與已建立的庫中的特征值相比較,對手勢進行匹配,將手勢輪廓缺陷圖映射到不同的手勢上去。
2. 1. 2 手勢匹配
手勢的匹配主要是基于手勢缺陷圖的匹配,手勢缺陷圖的特征值由外接多邊形以及谷底的位置和深度組成,如圖5所示。
?
根據多邊形的邊數以及各條邊的程度可以確定手指的數量,而谷底的深度和位置可以確定手指的關系和位置。由于這是根據手勢的整體圖像來進行分析,所以具有一定的魯棒性,當光線變化而導致手勢圖出現差別時,并不會導致手勢缺陷圖的變化。
2. 2 手勢跟蹤
對于手部跟蹤,主要是基于Camshift 算法實現的,它綜合利用了手勢圖像的顏色、區域和輪廓特征。Camshift 是Mean.Shift 算法的推廣,是一種有效的統計迭代算法,它使目標點能夠漂移到密度函數的局部最大值點。Camshift 跟蹤算法是基于顏色概率模型的跟蹤方法,在建立被跟蹤目標的顏色直方圖模型后,可以將視頻圖像轉換為顏色概率分布圖,每一幀圖像中搜索窗口的位置和尺寸將會被更新,使其能夠定位跟蹤目標的中心和大小。本文中,Camshift 算法被用于位置的粗定位,即確定當前手勢區域的外包矩形Rect,如圖6 所示。
?
Rect 將被用于前一步靜態手勢識別的輸入圖像,以便減少對圖像的分割以及模糊運算的工作量。
評論
查看更多