正文 基於Kinect的指尖檢測與手勢識別方法(1 / 3)

基於Kinect的指尖檢測與手勢識別方法

行業與領域應用

作者:談家譜 徐文勝

摘要:針對基於視頻的彎曲指尖點識別難、識別率不高的問題,提出一種基於深度信息、骨骼信息和彩色信息的手勢識別方法。該方法首先利用Kinect相機的深度信息和骨骼信息初步快速判定手勢在彩色圖像中所在的區域,在該區域運用YCrCb膚色模型分割出手勢區域;然後計算手勢輪廓點到掌心點的距離並生成距離曲線,設定曲線波峰與波穀的比值參數來判定指尖點;最後結合彎曲指尖點特征和最大內輪廓麵積特征識別出常用的12個手勢。實驗結果驗證階段邀請了6位實驗者在相對穩定的光照環境條件下來驗證提出的方法,每個手勢被實驗120次,12種手勢的平均識別率達到了97.92%。實驗結果表明,該方法能快速定位手勢並準確地識別出常用的12種手勢,且識別率較高。

關鍵詞:Kinect;膚色模型;開源計算機視覺庫;指尖檢測;手勢識別

中圖分類號: TP391.41 文獻標誌碼:A

英文摘要

Abstract:The recognition of bending finger points based on video is difficult and recognition rate is _disibledevent=16128128+0.2570.5640.098-0.148-0.2910.4390.439-0.368-0.071RGB

由於ROI區域中手勢區域麵積占比較大,因此可以適當地擴大膚色的判定閾值區間。經過大量測試實驗,發現136≤Cr≤170,70≤Cb≤127時,膚色分割出的效果較好。本文通過基於YCrCb對ROI區域的膚色進行提取,對提取出的膚色圖進行腐蝕、平滑和膨脹處理。為了之後指尖檢測的方便,利用OpenCV中的cvFindContours函數尋找出膚色分割後最大的膚色輪廓區域,排除一些膚色檢測小區域的幹擾,將分割出的手勢輪廓區域像素值設為0xff,其他區域設為0x00。整個手勢的提取過程如圖2所示(圖2(a)為ROI區域基於YCrCb膚色分割的初步處理,圖2(b)為基於圖2(a)的腐蝕操作,圖2(c)為基於圖2(b)的平滑處理,圖2(d)為基於圖2(c)的膨脹處理,圖2(e)為利用OpenCV找出的最大輪廓區域即手勢)。由圖2(e)可知輪廓相對於圖1(a)輪廓,邊緣變得更平滑了,減少了鋸齒狀對後期指尖點檢測的幹擾。

2 指尖點檢測

數字手勢最明顯的特征是手的指尖點,所以指尖點檢測算法的好壞將直接影響後期手勢識別的結果。有些研究者利用凸包算法來檢測指尖點,該算法對於伸直的指尖點的檢測沒有問題,但是凸包算法不能準確地檢測出手勢9的彎曲指尖點。為解決手勢9彎曲指尖點檢測問題,本文利用分割出的手勢進行掌心點計算以及對手勢輪廓點進行順時針提取,通過計算手勢輪廓點與掌心點的距離並生成距離曲線,找出距離曲線中的波峰波穀點。通過手掌骨骼可以發現人類伸直後的指尖點和兩相鄰指尖點間凹處與掌心點距離的比值變化不大。利用上述這一特性,設定比例閾值找出指尖點候選點,再結合不同手勢的其他特征判定該候選點是否是指尖點。

2.1 掌心點計算

微軟Kinect獲取的骨骼信息提供了左右手的掌心點坐標,但該掌心點坐標並不是很準確,而且也不是很穩定,因此本文舍棄了骨骼信息提供的掌心點。掌心點的計算可以直接對圖2(e)中手勢區域利用求幾何中心的計算公式來得到,但由於手指區域的影響,幾何中心與掌心點的偏差較嚴重。因此,為減少手指區域對掌心點計算的影響,本文在計算掌心點時引入權重係數。由圖3可以看出手勢5在不同的水平線前後像素值變化的次數不同,手掌區域變化的次數為2,手指區域變化次數則為4、6、8、10等。因此可以設定變化次數為6、8和10的區域像素值為零,利用cvFindContours函數重新獲得ROI區域內輪廓最大的區域。在該區域內對變化次數為4的區域坐標在進行掌心點計算時引入權重係數1/3,變化次數為2的區域坐標在進行掌心點計算時引入權重係數2/3,減少手指區域對掌心點的影響。利用幾何中心的計算公式來求掌心點,如果像素值為0x00,則該像素點在掌心點計算中不起作用。如果像素值為0xff,掌心點計算如式(1):對嗎,是否缺少內容紅色框內的兩處隻有從1到n的求和符號,沒有其他內容。

2.2 手勢輪廓點提取

要提取手勢輪廓點,首先需要從手勢區域中分離出輪廓邊緣點以及內部點。利用十字型窗口遍曆ROI區域的像素點,判斷處於該十字型窗口的像素值是否都為0xff。判斷結果為真則為內部點並去除,假則為輪廓候選點。遍曆循環結束後ROI區域隻剩下輪廓候選點。但是為實現順時針提取輪廓點,需要判定像素值為0xff的三個連續點是否構成了直角,是則消除該偽輪廓點,並用3*3的窗口去判定整個窗口內是否隻有兩個像素值為0xff,是則去除該毛刺點,防止有毛刺點使得程序崩潰。使得最後得出的輪廓可以滿足以下條件:遍曆循環ROI區域像素值,當判定像素值為0xff時,以此像素為中心做3*3的窗口,可以發現窗口始終隻有3個像素值為0xff,這有利於後麵的順時針輪廓點提取。上述步驟的大致過程如圖5所示。

通過掌心點坐標計算出圖像中同一行從左到右第一個像素值為0xff的坐標作為起始坐標start1存入輪廓點數組中,同一行從右到左第一個像素值為0xff的坐標作為終點坐標end。求取步驟如下所示:

1)以起始坐標點start1作為3*3窗口的中心,從3*3窗口左上角繞著start中心點順時針循環查看第一個像素值0xff的點作為坐標start2存入輪廓點數組中;

2)然後以start2為中心坐標查看3*3窗口中像素值為0xff且點坐標不為start1的坐標start3存入輪廓點數組中;

3)接著以上start3為中心查看3*3窗口中像素值為0xff且坐標不為start2的坐標start4存入輪廓點數組中。

按如上步驟循環直到存入輪廓點數組的坐標點為end點,將輪廓點順時針提取出來。接著輪廓點每隔4個點重新顯示在圖中,增加輪廓邊緣的平滑度,減少後期處理的計算量。如圖6所示。

2.3 候選指尖點檢測

獲得輪廓點後,按順序計算每個輪廓點與掌心點的距離並生成距離直方圖,利用波峰點上方的3*5窗口的像素值都為0x00以及波穀點下方3*5窗口的像素值為0xff的特點計算直方圖的波峰點和波穀點(將start1點和end點判定為波穀點)。此時的波峰點和波穀點數據還不適合直接用來做指尖點判斷,需要將數據經過下麵的處理:

1)對求取出來的波峰點集進行局部波峰點抑製,當兩個波峰點的橫坐標相差在15個像素內,舍棄距離掌心點相對小的波峰點,將剩下的波峰點按橫坐標從小到大排序。

2)對求取出來的波穀點集按橫坐標從小到大排序,檢測每兩個相鄰的波穀點之間是否有波峰點,如果沒有波峰點,則舍棄距離掌心點相對大的波穀點。將檢測完的波穀點集按橫坐標從小到大排序。

3)檢測每兩個相鄰的波峰點之間是否有波穀點,如果沒有波穀點,則舍棄距離掌心點相對小的波峰點,將剩下的波峰點按橫坐標從小到大排序。

經過以上三步的處理之後,每相鄰兩個波穀點之間都有一個波峰點,每相鄰兩個波峰點之間都有一個波穀點。設置判定條件波峰點距掌心點的距離比上兩相鄰波穀點距掌心點的距離大於threshold1時(經實驗測定,閾值設為1.5時判定效果較好),則為指尖候選點。對於手勢5,指尖候選點即為指尖點。將手勢5檢測出的距離曲線數據、波峰點數據和波穀點數據輸出用Matlab顯示,如圖7所示。

3 手勢識別

不同的手勢所具有的特征是不一樣的,通過檢測這些特征可以分辨出不同的手勢。本文所要識別的手勢如圖8所示。將要識別的手勢的距離曲線數據輸出用Matlab顯示如圖9所示(圖9中(a)(b)橫坐標表示輪廓點數組中的第n個輪廓點,縱坐標表示輪廓點到掌心點的像素距離h,距離單位為像素點)。

由圖8可以發現手勢0和手勢OK都具有內輪廓特征,手勢2、6和8都具有兩個指尖點特征,手勢1、7、9都具有一個指尖點特征,手勢3、4、5分別具有比較明顯的指尖點特征(分別為3個,4個,5個),手勢拳頭沒有指尖點。上述特征結合圖9距離曲線的指尖特征可以將這12種手勢區分開來。12種手勢所具有的不同特征如表1所示。

手勢識別程序中的手勢判定步驟如下: