王巖全,孫博文
(哈爾濱理工大學計算機科學與技術學院,黑龍江 哈爾濱 150080)
在虛擬現實不斷發展的今天,手勢交互成為繼鼠標、鍵盤、觸摸屏之后新的人機交互方式。目前手勢交互產品以Leap Motion、Kinect為主,尤其是Leap Motion的出現,使得一些需要借助于外部硬件設備(如數字手套)的手勢交互方式黯然失色。但是,無論是Leap Motion還是Kinect都沒有像鼠標、鍵盤一樣普及,除了一些外部的環境因素,其自身的局限性是最大的原因。Leap Motion和Kinect主要針對游戲開發者與其公司發布的游戲交互產品,不適用于普通軟件,而且比起鼠標、鍵盤等硬件交互設備,其價格十分昂貴。傳統的單目攝像頭已經做到以圖像處理的方式在復雜環境中識別手勢[1],但無法對手勢進行深度識別,而且其研究成果停留在了二維空間,沒有做到像Leap Motion一樣實時地識別動作(如抓取物體)。由此,以普通單目攝像頭實現手勢交互具有十分重要的意義。
基于神經網絡的手勢識別也是一種常用的手勢識別方法[2]。由于手勢具有尺度變換、旋轉、平移等復雜變化,所以每種手勢需要選取不同背景、不同旋轉角度的有效圖片各100張用于訓練,因此基于神經網絡的手勢識別本質是對相同手勢姿態的歸類,并不是對手勢姿態變化參數的提取。由于在神經網絡層數較深的情況下計算量較大,無法保證交互的實時性,基于神經網絡的手勢識別適合運用于識別,并不適合于交互。
Leap Motion裝有雙紅外攝像頭,利用視覺差技術獲取手關節的空間位置并實時追蹤[3,4],而Kinect裝有RGB與CMOS紅外攝像頭、紅外發射器,二者都是基于雙目攝像頭的手勢交互。相比于此,單目攝像頭實現空間交互有兩大難點,手勢的深度識別與手勢的動作識別[5,6]。本文采用不同深度下手面積的變化確定深度值,以自創的匹配算法計算不同手勢圖像的匹配率,將不同手勢動作的運動信息預存到程序中,以匹配率的高低選擇不同的運動信息,達到動態手勢交互的效果。
本文的技術核心是以最優的匹配率選擇相對應的運動信息,匹配算法的選擇不僅決定了原始圖像的預處理方式,而且匹配率的高低直接影響手勢運動信息的選擇,決定著手勢交互的正確性。特征匹配是通過提取圖像的特征點來進行匹配的一種匹配方式[7,8]。如下實驗證明基于特征點匹配方式并不適用于手勢匹配。
實驗以預制在3D場景中的手模型與攝像頭信息進行實時匹配,實驗效果圖1和圖2所示。

Figure 1 Matching effect when the hand is open圖1 手展開時匹配效果

Figure 2 Matching effect when the hand is clenched圖2 手握拳時匹配效果
如圖1和圖2所示,左邊圖像為攝像頭拍攝的實時圖像,而右邊為3D場景中預制的手模型,匹配結果雜亂無章且嚴重受到外部環境的影響,不僅匹配錯誤頻發,無法獲取手的空間信息,手勢的變化更是無法識別。因此,必須對圖像進行預處理并提出自己的匹配算法。
一般圖像都是基于RGB顏色空間的[9],而人體膚色容易受到光照等亮度因素的影響,為了剔除亮度的影響,將RGB空間轉換為YCrCb空間。通過剔除表示明亮度的Y通道,保留表示色度的Cr與Cb通道,就可以忽略亮度的影響,將三維RGB空間降到二維CrCb空間[10],如圖3~圖5所示。轉換公式如下:
Y=0.257×R+0.564×G+0.098×B+16,
Cr=0.439×R-0.368×G-0.071×B+128,
Cb=-0.148×R-0.291×G+0.439×B+128
(1)

Figure 3 Result of Y color space圖3 Y顏色空間圖

Figure 4 Result of Cr color space圖4 Cr顏色空間圖

Figure 5 Result of Cb color space圖5 Cb顏色空間圖
剔除Y通道,保留CrCb通道后,以Cr值在133~173、Cb值在77~127為依據,判定該點為膚色點,其他部分就為非膚色點。將0~255亮度等級的灰度圖像進行閾值選取,對灰度圖像進行閾值選取,將圖像轉化為二值圖[11,12]。轉換公式如下:

(2)
如圖6所示,圖像中膚色與膚色相近的成分轉換為白色,其余部分轉換為黑色。為了剔除非手勢部分,下面計算圖像輪廓面積。

Figure 6 Result of binary process圖6 二值化圖
在二值化后的單通道圖像中,像素值分為0與255。可以根據相鄰像素點像素值大小的變化繪制輪廓圖[13,14]。輪廓由像素點集合構成,在程序中以序列的方式存儲于內存中。

Figure 7 Contour of gesture圖7 手勢輪廓圖
圖7所示為白色輪廓的手勢輪廓圖。由于不規則輪廓的面積難以計算,且此處僅僅是利用面積的大小進行比較來剔除其他的輪廓,因此采用輪廓所圍像素點的個數來近似取代輪廓面積進行比較。根據輪廓像素點集合的位置信息,對像素在相同y軸下x軸的坐標由小到大,方向由y軸方向從小到大進行計數,統計像素值為255的像素點個數。
(3)
不同手勢面積的大小范圍可以根據實驗獲得。在此處手勢交互中,手的輪廓面積比其他非手輪廓面積大,因此只需要設置最小值來剔除其他輪廓。
圖8為剔除非手勢區域后的圖像。在剔除非手勢區域之后就可以對手勢區域進行截取。

Figure 8 Binary image after eliminating other contours圖8 剔除其他輪廓后的二值圖
剔除非手勢因素之后,為了更容易地進行圖像匹配,需要截取圖像中的手勢。通過比較輪廓像素點中的x軸坐標值與y軸坐標值的大小,選出最大與最小x軸坐標值y軸坐標值的四個像素點,以四個像素點位置為基準截取手勢。截取到的手勢區域如圖9所示。

Figure 9 Gesture圖9 手勢圖
由于截取的圖像大部分為長方形,不便于之后的圖像匹配,需將圖像轉換為正方形。如果將長方形圖像直接進行尺寸縮放,手勢輪廓必然會發生變形,此處選取長和寬中較長的邊為基準重新進行截取,此時截取的圖像為正方形,再次進行尺寸縮放時手勢不會發生變形。調整后的手勢圖如圖10所示。

Figure 10 Adjusted gesture圖10 調整后的手勢圖
為了更好地實現手勢的匹配,本文的匹配算法不僅需要區分不同的手勢,而且還要計算出明確的匹配率。
為了方便匹配,將所有手勢進行尺寸縮放,這里將其縮放為100×100像素大小。采用線性插值算法對圖像進行縮放,如圖11所示。縮放圖像的像素值根據映射到源圖像附近的四個鄰近像素的線性加權計算得出,權重與四個像素點的距離成反比。這里以sx,sy表示源圖像像素點的橫坐標值和縱坐標值;sw,sh表示源圖像的寬度與高度;dx,dy表示目標圖像像素點的橫坐標值和縱坐標值;dw,dh表示目標圖像的寬度與高度;a1,a2,a3,a4表示源圖像中與目標圖像相對應像素點的鄰近的四個像素點的像素值;k1,k2,k3,k4表示四個點的權重;x表示目標圖像的像素值。

Figure 11 Schematic of linear interpolation algorithm圖11 線性插值原理圖
x由a1,a2,a3,a4四個值加權平均求出。通過計算目標像素點在整個圖像中的相對位置可以計算出與其相對應的源圖像中像素點的坐標值。計算出的坐標值為小數,通過坐標值的上取整和下取整與坐標值之間的差值可以計算出各個權值。計算公式如下:
x=((a1×k1+a2×k2)+(a3×k1+a4×k2)+(a1×k3+a3×k4)+(a2×k3+a4×k4))/4
(4)
sx/sw=dx/dw,則sx=dx×sw/dw,
sy/sh=dy/dh,則sy=dy×sh/dh,




縮放后的手勢圖如圖12所示。

Figure 12 Scaled gesture圖12 縮放后的手勢圖
由此便可計算出目標圖像每個像素點的像素值。在完成圖像縮放之后,接下來就是對圖像進行匹配。在進行手勢交互時,應該預先將不同的手勢圖像預制到計算機中,這樣就可以實時將攝像頭讀取的圖像與預制的圖像進行匹配。這里將目標圖像的每個像素點與預制圖像每個像素點的像素值大小一一比較,統計出相同位置像素值相同的像素點個數count,用count除以總像素點數也就是10 000,便可求出不同目標圖像與預制圖像的匹配率rate。由于圖像在縮放時進行了插值算法運算,輪廓邊緣點的像素值不一定會等于0或255,因此在對count進行計數時,目標圖像與預制圖像在相同位置像素點的像素值如果不同時等于0或255時也進行計數。這里將這種匹配算法稱為完全重疊匹配。完全重疊匹配算法不僅可以計算出不同手勢(如握拳與展開)的匹配率,而且細微手勢動作變化(如繞空間某個方向旋轉1度)的匹配率也會產生變化。這樣就可以根據目標圖像與不同預制圖像匹配率的高低選擇最合適的運動信息。
計算匹配率,首先計算count,當兩幅圖像所有相同位置的像素值同時為0,或者同時為255或者既不是0也不是255時,對count進行計數,將計數完后的count除以圖像像素點的總個數得到匹配率。計算公式如下:
count=
rate=count/10000
(5)

Figure 13 Matching rate of different gestures圖13 不同手勢的匹配率
如圖13所示,不同手勢圖與預制手勢圖的匹配率各不相同。理論上,相同手勢的匹配率應該為100%,但由于手在現實場景中的動作不可能與錄入時的動作完全一致,且攝像頭的擺放位置、角度也不一定完全相同,但是相較于其他不同的手勢,相同手勢間的匹配率最高,且與不同手勢間的匹配率相差較大,足以用來區分其他手勢,從而選擇正確的運動信息。
目標圖像是由攝像頭獲取現實場景的手勢信息再加上前期的圖像處理實時生成的,在手勢發生變化時,目標圖像也在實時地變化。手在二值圖中的坐標也在同步變化,通過實時比較當前手勢位置與前一時刻手勢位置的變化便可以獲取手勢在平面上移動的方向。如圖14所示,這里選取e點作為手勢坐標的基準點。在手勢位置沒有發生變化,但動作發生變化時(如握拳),圖中五點a、b、c、d、e除了e點之外,其余四個點的坐標都會發生變化。因此,選取e點作為手勢位置基準點,這樣就避免了手勢位置沒有發生變化而動作發生變化帶來的對手勢移動信息的誤判。通過當前時刻的手勢位置的坐標值減去上一時刻手勢位置的坐標值的正負和大小來判斷移動的方向與速率。
Δx=xt2-xt1,
Δy=yt2-yt1,
depth1=k×s1+g,
depth2=k×s2+g
(6)
其中,Δx與Δy表示e點在x軸方向與y軸方向的偏移量。xt1與xt2表示e點在t1時刻與t2時刻的橫坐標,yt1與yt2表示e點在t1時刻與t2時刻的縱坐標。depth1與depth2為不同時刻的手勢深度值,s1與s2為不同時刻的手勢面積。通過聯立方程組可以求出手勢面積與手勢深度之間的線性參數k與g。

Figure 14 Change of rectangular coordinate圖14 矩形框坐標變化
接下是來獲取深度信息。這里采用手勢輪廓面積的大小來判斷深度值。由于同一深度下不同手勢面積不同,因此不同手勢應運用不同的判斷基準。通過選取不同手勢在兩種深度下的輪廓面積,聯立方程組計算出不同手勢深度與手勢面積之間的線性參數k與g,就可以計算出不同手勢的深度值。
在三維坐標系中,各種手勢姿勢都可以經由基本的手勢經過平移與旋轉得到,而平移與旋轉屬于圖形幾何變換中的兩種基本變換,復雜的幾何變換可以通過基本的幾何變換復合實現。例如,手的3D模型的幾何變換,可以將其中一點的復雜幾何變換分解為基本的平移與旋轉變換,再根據原模型的拓撲關系連接新的頂點實現整個模型的幾何變換。而這些基本的變換是通過引入齊次坐標技術實現的。通過將三維空間中的復雜問題擴展到四維空間,可以將幾何變換轉換為矩陣相乘的數學表示,借助于計算機的高速處理,實現手模型的移動與旋轉。
由于攝像頭坐標系與3D場景坐標不同,手移動時要調整代表移動方向的數值正負。
由圖15可知,攝像頭坐標系的x軸與3D場景坐標系中的x軸同方向,所以現實中手勢在x軸變化的方向與3D場景中手勢模型的變化方向相同,攝像頭坐標系的y軸方向與3D場景中的y軸坐標系方向相反,所以在進行矩陣變換時,y軸坐標值前要加負號。
模型在3D場景坐標系中的x軸與y軸方向的坐標值是通過初值加變化值確定的,而在z軸方向的坐標值是通過手勢面積的線性運算直接得到的,不需要進行平移變換。
[xyz1]=
(7)

Figure 15 Coordinate system of camera and 3D scene圖15 攝像頭坐標系與3D場景坐標系
通過不斷計算模型的空間坐標值就可以實現模型的空間移動。在完成模型的空間移動之后,接下來要實現手的動作變化。任何手動作變化都可以通過手指關節的旋轉實現,而每個手指關節都是繞它的上一個關節進行旋轉的。關節點的坐標值可以通過繞前一個關節軸的三維旋轉變換得到。這里將繞關節點軸旋轉的三維旋轉問題轉化成平移、旋轉的復合變換,抽象為矩陣連乘的數學公式。定義要旋轉關節點的坐標為(xa,ya,za),關節點所要旋轉的角度為θ,其所繞關節點的坐標為(xb,yb,zb),所繞的軸為L、軸L經過關節點(xb,yb,zb),且軸L繞3D場景坐標系中的x軸旋轉α角,繞y軸旋轉β角后會與z軸重合。α與β可以通過模型在3D場景中的歐拉角得出。

(8)
通過預先載入關節旋轉角度,計算機不斷計算關節點的位置就可以實現各種手勢動作交互。
交互不僅要保證正確性,還要保證實時性。本實驗交互實時性體現在3D場景的流暢程度,這里用幀數作為實時性的判斷標準。交互達到24幀/秒便認為交互流暢,滿足實時性要求。普通攝像頭的幀數在30幀/秒左右,也就是說攝像頭獲取一張現實場景圖像的時間在33.33 ms左右,將獲取圖像的時間加上圖像預處理、圖像匹配到最后得出手運動信息的時間看做一個周期。可以用程序測出整個周期中獲取圖像后處理圖像的時間,大約為34 ms。也就是說交互處理一幀的時間為67.33 ms,換算成幀數約為13幀/秒。由此可以看出程序處理圖像的時間過長,會導致交互不流暢。而程序處理圖像的時間主要集中在圖像匹配部分。由于完全重疊匹配需要比較大小為100×100圖像的
每個像素點,每處理一幀圖像程序都要循環10 000次,因此必須調整圖像的大小以縮短圖像處理時間。
由表1可知,隨著圖像尺寸的縮小,程序運行時間越來越快,幀數越來越高,但是匹配的正確率越來越低,這是由于圖像在運用插值法縮放時,像素值為0與255的像素點個數越來越少,黑白成分越來越少,圖像變得模糊,匹配率下降。當圖像尺寸為30×30時,交互界面的幀數達到26幀/秒,匹配正確率為98%,完全可以滿足實時性要求。
為了展現交互的效果,這里預制手展開與抓取圖像,并將手展開與抓取的運動信息預存到程序當中,從而實現手抓取物體的交互。抓取場景物體,將其放到木箱上。實驗效果如圖16所示。

Figure 16 Gesture interaction of grasping objects圖16 抓取手勢交互
只要預制不同的手勢圖像與運動信息,就可以實現不同的手勢交互。實驗效果如圖17所示。

Table 1 Real-time comparison among images of different sizes表1 不同大小圖像的實時性比較

Figure 17 Different hand gestures圖17 不同的手勢動作
在虛擬現實和增強現實不斷發展的今天,人們在追求視覺真實感的同時,也在追求交互的真實感。尤其在游戲領域,傳統的鼠標鍵盤逐漸無法滿足人們的需求。現今的交互設備由于價格等因素,并沒有普及到人們的日常生活中。本文基于普通的單目攝像頭通過獲取現實場景中手的圖像并對其進行圖像處理,獲取其移動信息,再結合圖像匹配的方式選取不同手勢的動作信息來完成手勢交互。不僅保證了交互的正確性,而且通過實驗選取合適的圖像尺寸,保證了交互的實時性。交互不需要借助專用的手勢交互產品,使得手勢交互更加便捷與普及。