基于嵌入式系統(tǒng)實時交互的手勢識別
Typedef struct CvConvexityDefect{
CvPoint* start; / /缺陷開始的輪廓點
CvPoint* end; / /缺陷結(jié)束的輪廓點
CvPoint* de pth_point; / /缺陷中距離凸性最遠(yuǎn)的輪廓點
Float depth; / /谷底距離凸性的深度
} CvConvexityDefect;
如圖4 所示,手勢輪廓缺陷圖能很好地描述各種手勢,通過對手勢輪廓線外接多邊形的邊數(shù)以及邊所對應(yīng)的谷底深度,可以將手勢缺陷圖映射到不同的手勢。其中A、B、C、D、E、F、G為手勢輪廓線的外接多邊形的各條邊,Da、Db、Dc、Dd、De、Df、Dg為手勢缺陷圖中的谷底到對應(yīng)邊的深度。
為了得到手勢輪廓缺陷圖,首先必須對手勢輪廓進(jìn)行多邊形擬合,得出它的外接多邊形。本文提出了一種根據(jù)手勢輪廓上相鄰兩點間的凹凸性來進(jìn)行擬合,通過一次遍歷輪廓上的點,對以下方程進(jìn)行判定,將適當(dāng)?shù)狞c剔除,剩下的點即為外接多邊形的候選定點:
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 為當(dāng)前遍歷的輪廓線上的點; pprev、pnext 分別表示當(dāng)前點的前一個點和后一個點; ax、ay 分別為當(dāng)前點和前一點的x 和y 坐標(biāo)值差; bx、by 分別為當(dāng)前點和后一點指尖的x 和y坐標(biāo)值差。
基于輪廓線凹凸形的擬合算法流程如下:
a) 將所有的輪廓線上的點按x 坐標(biāo)值大小排序,并找出所有的點中y 坐標(biāo)的最大最小值maxY 和minY.
b) 將排序后的輪廓點劃分為四部分: 首先按照y 坐標(biāo)將輪廓線分為上下兩個部分,將上半部分以maxY 所在的x 坐標(biāo)( 記為Xmaxy) 劃分為兩個部分,分別記為topLeft〈左上〉和topRight〈右上〉; 將下半部分以minY 所在的x 坐標(biāo)( 記為Xminy) 劃分為兩個部分,分別記為bottomLeft〈左下〉和bottom-Right〈右下〉。
c) 分別對前一步劃分的四個部分( topLeft, topRight,bottomLeft,bottomRight) 進(jìn)行遍歷: 對區(qū)域topLeft 將滿足式( 1) 《0,式( 2) > 0 的點剔除; 對區(qū)域TopRight 將滿足( 1) 0,式( 2)0 的點剔除; 對區(qū)域bottomLeft 將滿足式式( 1) > 0,式( 2) >0 的點剔除; 對區(qū)域bottomRight 將滿足式( 1) > 0,式( 2) > 0 的點剔除。剔除后剩下的點即為手勢輪廓線外接多邊形的頂點。
手勢缺陷圖的谷底以及谷底深度的求解是建立在擬合外接多邊形基礎(chǔ)上,還需要對外接多邊形的每條邊所對應(yīng)的輪廓線再進(jìn)行一次遍歷,并將滿足以下方程的最大值求出即是該邊所對應(yīng)的谷底:
其中: scale 為單位化量值; hull_cur 和hull_next 分別為外接多邊形當(dāng)前遍歷的邊和下一條邊; dx0、dy0分別為外接多邊形當(dāng)前邊的x 和y 坐標(biāo)的差值; dx、dy 分別為當(dāng)前遍歷的輪廓線上的點與hull_cur 點之間x 和y 坐標(biāo)的差值; depth 為遍歷點與對應(yīng)邊之間的距離,它的最大值即為該邊對應(yīng)的谷底深度,相應(yīng)的點為谷底。
通過以上搜索可以將手勢輪廓缺陷圖的特征值找出來,接下來便可以將缺陷圖的特征值( 多邊形與谷底的關(guān)系) 與已建立的庫中的特征值相比較,對手勢進(jìn)行匹配,將手勢輪廓缺陷圖映射到不同的手勢上去。
2. 1. 2 手勢匹配
手勢的匹配主要是基于手勢缺陷圖的匹配,手勢缺陷圖的特征值由外接多邊形以及谷底的位置和深度組成,如圖5所示。
根據(jù)多邊形的邊數(shù)以及各條邊的程度可以確定手指的數(shù)量,而谷底的深度和位置可以確定手指的關(guān)系和位置。由于這是根據(jù)手勢的整體圖像來進(jìn)行分析,所以具有一定的魯棒性,當(dāng)光線變化而導(dǎo)致手勢圖出現(xiàn)差別時,并不會導(dǎo)致手勢缺陷圖的變化。
2. 2 手勢跟蹤
對于手部跟蹤,主要是基于Camshift 算法實現(xiàn)的,它綜合利用了手勢圖像的顏色、區(qū)域和輪廓特征。Camshift 是Mean.Shift 算法的推廣,是一種有效的統(tǒng)計迭代算法,它使目標(biāo)點能夠漂移到密度函數(shù)的局部最大值點。Camshift 跟蹤算法是基于顏色概率模型的跟蹤方法,在建立被跟蹤目標(biāo)的顏色直方圖模型后,可以將視頻圖像轉(zhuǎn)換為顏色概率分布圖,每一幀圖像中搜索窗口的位置和尺寸將會被更新,使其能夠定位跟蹤目標(biāo)的中心和大小。本文中,Camshift 算法被用于位置的粗定位,即確定當(dāng)前手勢區(qū)域的外包矩形Rect,如圖6 所示。
Rect 將被用于前一步靜態(tài)手勢識別的輸入圖像,以便減少對圖像的分割以及模糊運算的工作量。
3 手勢交互演示系統(tǒng)
本文在Linux 系統(tǒng)下實現(xiàn)了本文提出的基于手勢輪廓缺陷圖進(jìn)行手勢識別的方法,并在“嵌入式之星”開發(fā)板上實現(xiàn)了手勢識別的人機(jī)交互演示系統(tǒng)。系統(tǒng)處理器800 MHz,存儲器RAM256 MB,實時采集640 × 480 的真彩色圖像。該系統(tǒng)分析攝像頭實時捕獲到的每一幀圖像,對圖片中的手勢進(jìn)行實時識別。系統(tǒng)的應(yīng)用程序是一個基于手勢識別的拼圖游戲,通過變換手勢來完成拼圖。可識別的靜態(tài)手勢狀態(tài)被分為五類: A為握拳、B 為食指伸長、C 為V 型手勢、D 為中間三指伸開、E為五指張開。A、E 手型分別對應(yīng)抓取與松開。手勢為握拳狀態(tài)時,手對應(yīng)的圖片塊被選中( 類似鼠標(biāo)左鍵按下) ,此時可以拖動圖片,選定位置后可以換成手勢E,圖片將被松開( 類似鼠標(biāo)左鍵松開) ,B、C、D 手勢分別表示將圖片放大、縮小和旋轉(zhuǎn)。
演示系統(tǒng)效果如圖7 所示。
4 實驗結(jié)果及分析
為了檢驗本文算法的準(zhǔn)確性和實時性,本文在實驗室光照條件下,采集不帶任何特殊標(biāo)記的手勢單目視頻圖像。實驗中參數(shù)設(shè)置如下: Camshift 算法的最大迭代次數(shù)為10; 手勢分割使用的HSV 顏色空間如表1 所示。
表1 HSV 顏色空間設(shè)置
對手勢二值圖像所做的數(shù)學(xué)形態(tài)學(xué)操作使用3 × 3 的模板做開運算,使用5 × 5 的模板做閉運算; 噪聲手勢的域值設(shè)為0. 01.手勢的跟蹤過程無人工干預(yù)。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評論