高 晨, 張亞軍(北京化工大學 機電工程學院, 北京 100029)
基于Kinect深度圖像的指尖檢測與手勢識別①
高 晨, 張亞軍
(北京化工大學 機電工程學院, 北京 100029)
針對基于普通攝像頭的手勢識別系統(tǒng)在不同光照條件和復雜環(huán)境下易受影響的問題, 提出一種基于kinect深度圖像進行指尖檢測和手勢識別的算法. 首先利用Kinect傳感器獲取深度圖像, 再利用OpenNI手部跟蹤器檢測出手部的位置, 根據(jù)手部位置對手勢進行深度閾值分割. 提出一種結合凸包和曲率檢測指尖的算法, 檢測出指尖數(shù)目和位置后, 計算出包括指尖和手掌水平方向的夾角、相鄰兩個指尖夾角以及指尖與掌心的距離的特征向量, 最后利用支持向量機(SVM)對預定的9種數(shù)字手勢進行識別. 實驗邀請5位實驗者在復雜環(huán)境下每個手勢做30次, 每次的手勢角度不同, 實驗結果表明該方法能夠準確檢測出指尖的數(shù)目和位置, 9種數(shù)字手勢平均識別率達到97.1%, 該方法使用特征簡單, 實時性好, 有較好的魯棒性.
Kinect傳感器; 指尖檢測; 支持向量機; 手勢識別
不同于以往的鼠標、鍵盤等交互設備, 手勢作為一種新的人機交互方式, 不需要直接接觸, 這種人機交互方式更接近人與人之間的交流. 手勢識別系統(tǒng)可以通過攝像頭獲取包含手勢的圖像信息, 根據(jù)圖像信息解釋手勢的含義, 成熟的手勢識別系統(tǒng)已經開始應用于很多領域, 如體感游戲, 智能電視, 醫(yī)療設備, 手語識別和機器人控制等[1-3].
采用普通攝像頭獲取圖像信息進行手勢識別容易受到光照和背景的影響, 針對此問題, 文獻[4]通過給使用者佩帶有顏色的手套來分割手勢. 但是當背景有和手套顏色一樣的物體時, 仍會影響手勢的分割, 并且文獻[4]使用的普通攝像頭在光線不足的情況無法檢測到手勢. 而微軟推出的Kinect攝像頭可以同時獲取彩色圖像和深度圖像信息, 利用深度圖像進行手勢識別可以避免光照和環(huán)境的影響.
近幾年基于Kinect的指尖檢測和手勢識別已經有相關的研究, 文獻[5]采用三維手勢模型, 將手部分成21個不同的部分, 然后使用支持向量機(SVM)做分類器識別常用的手語. 但是其模型復雜, 運算量大, 實時性較差. 文獻[6]和[7]都采用深度閾值分割手勢區(qū)域,默認手勢區(qū)域是距離攝像頭最近的, 但是當手掌和手臂垂直的情況下就會將手臂也分割出來, 降低手勢識別的準確率. 文獻[8]使用距離直方圖來識別手勢, 而文獻[9]綜合了距離特征和曲率特征使用多級支持向量機來識別手勢. 文獻[10]通過從深度圖像中分割手部區(qū)域, 并建立表觀特征, 再用決策樹識別手勢. 文獻[8-10]使用的特征都較復雜, 需要的計算量較大.
針對上述問題本文提出一種把指尖數(shù)目, 手部方向, 掌心和指尖距離以及指尖相對于手部水平方向夾角作為特征向量, 再通過支持向量機的方法進行手勢識別的算法, 如圖1所示.
圖1 手勢識別流程圖
主要的工作步驟如下:
Step 1. 檢測到手部區(qū)域, 將手部區(qū)域從復雜背景中分割出來;
Step 2. 根據(jù)分割出來的手勢區(qū)域, 計算出手掌掌心、手部水平方向, 再結合凸包和曲率檢測指尖, 最后計算出指尖相對于手部水平方向的夾角, 相鄰指尖之間的夾角和指尖與掌心的距離;
Step3. 最后采集9種預設數(shù)字手勢樣本, 用支持向量機方法訓練識別手勢.
Kinect攝像頭可以同時獲取深度圖像和RGB彩色圖像, 并且支持骨骼跟蹤和動作識別. Kinect一共有三個攝像頭, 左邊鏡頭為紅外線發(fā)射器, 中間鏡頭是一般常見的 RGB 彩色攝像頭, 右邊鏡頭是由紅外線CMOS 攝像頭所構成的 3D 深度傳感器. 根據(jù)深度傳感器可以獲取攝像頭一定范圍內物體與攝像頭的距離.
2.1 基于OpenNI的手勢檢測
通過開源庫OpenNI可以檢測到揮手、前推和舉起三種預設手勢動作并獲得手部掌心的坐標. 本文采用識別效果較好的前推動作和揮手動作, 手部對著Kinect攝像頭前推或者揮手時, 即可檢測到手部區(qū)域,并且給出掌心的粗略坐標, 識別效果如圖2所示. 距離攝像頭越近的點灰度值越大, 離攝像頭遠的點灰度值越小, 紅色的點為識別出來的掌心位置, 從圖2可以發(fā)現(xiàn)OpenNI給出的掌心位置不準確, 本文將根據(jù)手部輪廓的最大內切圓重新計算掌心坐標.
圖2 OpenNI檢測出掌心位置
2.2 基于深度閾值的手勢分割
Kinect獲取到的深度數(shù)據(jù)為16位, 若使用不帶用戶ID的方式存儲深度值, 則16位中的低12位為深度值, 即最大值為4096, 其代表4.096m. 通過OpenNI獲得的粗略掌心坐標包括二維坐標和深度值, 本文采用雙深度閾值方法分割手勢區(qū)域, 對掌心深度d在加減閾值T范圍內的像素按照式(1)進行二值化, 公式如下所示:
式(1)中d為掌心的深度值, T為手掌厚度的深度閾值, H(x, y)為分割后手部深度圖像中點(x, y)所對應的像素值, D(x, y)為深度圖像中點(x, y)所對應的深度值.
為了避免手臂和手腕的干擾, 取距離掌心長寬一定的矩形作為包含手勢的感興區(qū)域, 分割效果如圖3所示, 從圖3(b)中可以看到經過式(1)分割出的手部區(qū)域, 其邊緣存在鋸齒, 會對之后的指尖檢測造成干擾,針對此問題, 本文采用中值濾波和形態(tài)學開閉運算對其進行去除噪聲處理, 使手部邊緣平滑, 效果如圖3(c)所示.
圖3 基于深度閾值的手勢分割
3.1 手部邊緣檢測
為了獲取手部輪廓的特征, 本文采用Canny邊緣檢測算法, 邊緣檢測即檢測出圖像亮度變化大的區(qū)域, Canny 邊緣檢測算法是對信噪比和定位之乘積的最優(yōu)化逼近算子, 用來計算圖像邊緣的梯度幅度和相位值,選取合理幅度閾值來確定邊緣點[11]. 從抑制噪聲方面來講, Canny邊緣檢測子不容易受到噪聲的干擾, 而相同尺度下LOG算子卻容易受到噪聲的干擾, 抑制噪聲的能力要弱一些. 此外, 由于Canny邊緣檢測算子采用兩種不同的閾值分別檢測強邊緣和弱邊緣, 并且當弱邊緣和強邊緣相連時, 只將弱邊緣包含在輸出圖像中, 故而Canny算子更容易檢測出真正的弱邊緣, 因此本文采用Canny邊緣檢測來提取手部輪廓. 檢測效果如圖4所示.
圖4 Canny邊緣檢測
3.2 計算手掌掌心位置
通過OpenNI獲得的手掌掌心坐標不夠準確, 本文通過計算手部輪廓的最大內切圓來確定手掌掌心坐標和掌心圓半徑. 首先計算手部輪廓內每個點到輪廓邊界距離的最小值, 找出其中最大距離值所對應的點即為掌心點, 距離即掌心圓半徑. 這個過程計算量會很大, 影響手勢識別的實時性, 因此本文不計算感興區(qū)間內的所有點, 而是每隔N個點計算一個點, 經過實驗驗證當N=4時可以保證速度和準確性. 求出的掌心圓如圖5所示.
圖5 最大內切圓計算掌心圓
3.3 計算手部水平方向
為了計算指尖的相對位置, 要先計算手部水平方向, 如圖6所示, xh為手部水平方向, α為手部水平方向和x軸方向的夾角, θ為手部主軸和x軸方向的夾角, 這兩個夾角可以根據(jù)文獻[12]中提出的方法, 利用圖像中心矩計算, 公式如下所示:
式(2)中θ為手部主軸和水平方向的夾角, α為手部水平方向和x軸水平方向的夾角, (2,0)mu和(0,2)mu為圖像的二階中心矩.
3.4 指尖檢測
3.4.1 凸包結合曲率檢測指尖算法
本文采用凸包算法與曲率檢測算法相結合的算法, 可以精確的獲得指尖的位置, 首先求出包圍手部輪廓的最小外接圓, 然后利用OpenCV計算機視覺開源庫中函數(shù)convexHull和convexityDefects求出包含手部輪廓的凸包和凸缺陷, 手部輪廓的凸包和凸缺陷模型如圖7所示, A、B、C等為手部輪廓的凸缺陷, 凸缺陷包括起始點Ps、終止點Pe、缺陷上距離輪廓凸包最遠的點pd, 凸包缺陷深度Id. 根據(jù)指尖的幾何特征, 指尖點應該滿足的條件如下所示:
1) 凸缺陷深度應該大于掌心圓半徑, 但小于手部輪廓最小外接圓半徑, 即ra 2) 凸缺陷起始點和終止點的夾角應小于90°, 即θα<90o. 3) 指尖點附近最小曲率值應小于60°, 即θk<60o. 圖6 手部水平方向 圖7 凸包和曲率檢測指尖 檢測指尖時首先將滿足上述條件(1)和(2)的凸缺陷的起始點和終止點保存到點集Ap中, 并且刪除重復和距離過近的點, 然后以點集Ap中的點Pi為原點, 在手部輪廓中各取Pi之前和之后的10個點, 計算這20個點的K曲率, 即向量(Ai(j), Ai(j-k))與(Ai(j), Ai(j+k))之間的夾角, 若點Pi的K曲率值小于60°并且是20個點中K曲率值最小的點, 則其為指尖點. 本文算法相比較于傳統(tǒng)的K曲率檢測指尖運算量小, 只需要計算凸缺陷起始點和終止點極其附近的20個點的K曲率, 同時有效地排除了兩個手指指尖的凹點, 通過實驗驗證當K取值30時效果最好. 上述三個條件雖然能較好的滿足基本的指尖檢測, 但是也存在一些不足, 如只有一個指尖時, 是沒有凸缺陷滿足條件1)和2), 此時我們把凸缺陷起始點和終止點夾角 并且凸缺陷深度Id大于閾值Td的凸缺陷起始點和終止點存儲到點集Ap中, 然后通過上述方法計算點集Ap中點的K曲率通過條件3)來檢測指尖. 3.4.2計算指尖點與手部水平方向夾角 在獲得了掌心圓、手部方向, 指尖坐標等特征之后, 接下來計算指尖點和手部水平方向的夾角, 以及相鄰兩個指尖與掌心的夾角. 如圖8所示, 分別計算每個指尖與手部水平方向的夾角α[i](i=0, 1, 2, 3, 4),在計算相鄰兩個指尖和掌心形成的夾角β[i](i=0, 1, 2, 3), 最后計算每個指尖和掌心指尖的距離D[i](i=0, 1, 2, 3, 4), 最后把計算得到的結果保存到特征向量數(shù)組中, 如式(4)所示: 式(4)中fV儲存特征向量的數(shù)組, N為指尖數(shù)目, []iα為每個指尖和手部水平方向的夾角, []iβ為相鄰兩個指尖的夾角, D[]i為每個指尖與掌心的距離. 圖8 指尖夾角特征 在得到手部特征向量之后, 要設計分類器根據(jù)每種手勢的特征對手勢進行分類. 本文采用支持向量機作為分類器, 支持向量機具有能有效發(fā)現(xiàn)目標函數(shù)的全局最優(yōu)解, 最大化決策邊界等特點13. 在解決線性問題中, SVM 能直接在該空間中劃分出分割平面, 但在實際問題中更多的是非線性的問題, 支持向量機首先在低維空間中完成計算, 然后通過核函數(shù)將輸入空間映射到高維特征空間, 最終在高維特征空間中構造出最優(yōu)分離超平面, 從而把平面上本身不好分的非線性數(shù)據(jù)分開, 常用的核函數(shù)包括多項式核函數(shù)、徑向基(RBF)核函數(shù)和 Sigmoid 核函數(shù). 本文采用徑向基函數(shù), 因為其模型簡單, 參數(shù)相對較少, 可以有效的把非線性問題轉換為線性問題, 并經過實驗驗證徑向基核函數(shù)的效果最好. 為了驗證本文提出方法的可靠性和準確性, 本文使用內存8G, CPU為Intel(R)CoreTMi5-4200H CPU @2.80GHz的筆記本作為處理平臺, 使用微軟Kinect一代攝像頭采集圖像, 通過使用開源庫OpenNI、Opencv進行編程, 編程環(huán)境為VS2015, 實驗包括指尖檢測和手勢識別兩個部分, 實驗過程中光照環(huán)境不穩(wěn)定, 實驗者與Kinect攝像頭距離約為1m. 5.1 指尖檢測實驗分析 本文分別對指尖數(shù)目為0到5的六種情況進行測試, 測試過程中, 指尖的方向不斷變化, 測試結果如圖9所示. 然后將每種指尖數(shù)目的視頻序列保存1000幀, 每隔5幀提取1幀, 共提取200幀, 統(tǒng)計出檢測結果如表1所示. 圖9 不同數(shù)目、方向指尖檢測結果 表1 指尖檢測準確率 通過圖9和表1可以看出, 本文提出的結合凸包和曲率檢測指尖的算法平均準確率可以達到97.9%,在手部運動的過程中能準確的檢測出指尖的位置和數(shù)目, 可以有效排除手腕處的干擾點, 針對不同方向的指尖都可以準確檢測出來, 具有較好的魯棒性. 同時可以看出1個手指和三個手指的誤判比其他的多, 因為三個手指的情況較多, 在手指沒伸直的情況下, 容易造成誤判, 而一個手指則因為無法使用凸包和曲率結合算法, 容易受手腕干擾, 不同光照下的檢測效果如圖10所示. 圖10 不同光照下指尖檢測結果 5.1 數(shù)字手勢識別實驗 為了驗證本文提出的手勢識別算法, 本實驗針對如圖11所示的9種數(shù)字手勢進行識別, 實驗前先構建訓練樣本數(shù)據(jù)庫, 邀請5位實驗者針對每個手勢做10次, 要求每個手勢的角度不同, 總共采集450張樣本圖像, 然后對樣本圖像進行訓練, 計算每張樣本圖像對應的特征向量并保存結果. 訓練完成之后, 為了驗證算法的魯棒性, 再邀請另外的5個人實時檢測手勢, 每個手勢做30次, 即測試樣本圖像共1350張, 每種手勢的識別率如表2所示. 圖11 9種數(shù)字手勢 表2 9種數(shù)字手勢檢測結果 從圖11和表2可以看出, 用指尖與掌心的距離、指尖與手部水平方向的夾角以及相鄰指尖之間的夾角作為特征向量可以明確的表示出每種手勢的特征, 平均手勢識別率可以達到97.1%, 其中手勢3和手勢6誤檢率最高, 因為手勢3不是正對著攝像頭時容易因為遮擋而識別錯誤, 手勢6因為在運動過程中小拇指會因為噪聲干擾而誤判為手勢8. 每幀手勢識別處理時間平均為0.015秒, 實時性比較好. 本文方法與常用的HOG+SVM、幾何特征、模板匹配方法14相比使用的特征簡單, 計算量小, 準確率也相差不多. 本文通過使用Kinect深度圖像信息進行指尖檢測和手勢識別, 有效地解決了在不同光照條件和復雜背景下指尖檢測和手勢識別的難題, 提出一種結合凸包和曲率檢測指尖算法, 避免傳統(tǒng)曲率檢測誤判點多和凸包檢測位置不準確的缺點. 檢測出指尖后, 提出一種需要樣本少, 方法簡單的手勢識別算法, 該方法利用指尖與手部水平方向夾角, 相鄰指尖夾角以及指尖和掌心距離作為特征向量, 使用支持向量機做分類器.通過實驗證明該算法手勢識別精度較高, 指尖檢測較準確, 能夠在不同光照條件和復雜背景下進行檢測,魯棒性較好. 但是本文提出的方法在手指并在一起等一些特殊情況無法準確檢測出指尖, OpenNI的手部跟蹤器效果不是很好, 在有遮擋的情況會跟丟手部區(qū)域, 在今后的工作中研究更精確, 魯棒性更好的跟蹤算法. 1 孫麗娟,張立材,郭彩龍.基于視覺的手勢識別技術.計算機技術與發(fā)展,2008,18(10):214–216. 2 易靖國,程江華,庫錫樹.視覺手勢識別綜述.計算機科學, 2016,43(6A):103–108. 3 李勇,高文,姚鴻勛.基于顏色手套的中國手指語字母的動靜態(tài)識別.計算機工程與應用,2002,17:55–58. 4 Lamberti L, Camastra F. Real-time hand gesture recognition using a color glove. Springer Proc. of the 16th International Conference on Image Analysis and Processing, 2011, 6978(1): 365–373. 5 Keskin C, Kirac F, et al. Real time hand pose estimation using depth sensors. IEEE International Conference on Computer Vision Workshops, 2011, 28(5): 1228–1234. 6 王艷,張奇志.基于Kinect深度信息的手勢識別.北京信息科技大學學報,2013,28(1): 22–26. 7 鄧瑞,周玲玲,應忍冬.基于Kinect深度信息的手勢提取與識別研究.計算機應用研究,2013,30(4):1263–1265. 8 Ren Z, Yuan J, Zhang Z. Robust hand gesture recognition based on finger earth mover’s distance with a commodity depth camera. Proc. of ACM Conference on Multimedia. 2011. 1093–1096. 9 Domini F, Donadeo M, Marin G. Hand gesture recognition with depth data. ARTEMIS ’13 Proc. of the 4th ACM/IEEE International Workshop on Analysis and Retrieval of Tracked Events and Motion in Imagery Stream. 2013. 9–16 10 曹雛清,李瑞峰,趙立軍.基于深度圖像技術的手勢識別方法.計算機工程,2012,38(8):16–18. 11 薛麗霞,李濤,王佐成.一種自適應的Canny邊緣檢測算法.計算機應用研究,2012,27(9):3588–3590. 12 Liao SX, Pawlak M. Image Analysis by Moments. The University of Manitoba Winnipeg, 1993. 13 祁亨年.支持向量機及其應用研究綜述.計算機工程,2004, 30(10):6–9. 14 劉淑萍,劉羽,淤俊,汪增福.結合手指檢測的HOG特征的分層靜態(tài)手勢識別.中國圖像圖形學報,2015,20(6):781–788. Fingertip Detection and Hand Gesture Recognition Based on Kinect Depth Image GAO Chen, ZHANG Ya-Jun Aiming at the problem that hand gesture recognition system based on ordinary camera is susceptible to the different lighting conditions and complex background, a fingertip detection and hand gesture recognition algorithm based on Kinect depth image is proposed. First, we get depth image by Kinect sensor. Then the hand region is extracted by putting the depth of thresholds on hand point detected by using OpenNI library. Fingertip detection based on convex hull and curvature is proposed. After the number of fingertips and the location of fingertips being detected, it calculates a feature vector including the number of fingers, the angles between fingertips and horizontal of the hand, the angles between two consecutive fingers, and the distance between fingertips and hand center point. Finally, a support vector machine(SVM) is applied to identify nine scheduled number hand gesture. Five experimenters are invited to perform 9 different hand gestures in the complex environment, which each gesture is repeated at thirty times and the angle of hand gesture is different every time. The experiment results show that this algorithm can detect the number and location of fingertips, and the recognition rate of nine hand gesture is 97.1% on average. This proposed method uses simple features and has good robustness, also it is real-time. Kinect sensor; fingertip detection; support vector machine; hand gesture recognition 2016-07-31;收到修改稿時間:2016-09-23 10.15888/j.cnki.csa.0057014 手勢訓練和識別
5 實驗結果和分析
6 結語
(Beijing University of Chemical Technology, College of Mechanical and Electrical Engineering, Beijing 100029, China)