洪期望,李捍東
(貴州大學(xué)電氣工程學(xué)院,貴陽 550025)
手勢識別主要目的就是能夠讓用戶與機器能夠更簡單的交流,特別是具有人體障礙的殘疾人士。早期的學(xué)者主要利用傳感器去采集手勢數(shù)據(jù),這種方法雖然能夠得到較高的準確率,但是硬件價格普遍昂貴。近幾年,計算機視覺領(lǐng)域技術(shù)飛速發(fā)展,各大領(lǐng)域的學(xué)者們都開始紛紛涌入計算機視覺的懷抱。研究大體可以分為兩大類,一類是基于人工特征提取的手勢識別[1],這種方法需要人為去提取手勢特征,然后對其進行處理,這種方法容易受到外界因素的影響,背景顏色變化也會對結(jié)果帶來較大的誤差;另外一類是基于深度學(xué)習(xí)的手勢識別研究[2],采用深度卷積和遞歸神經(jīng)網(wǎng)絡(luò)來實現(xiàn),該方法使用四個深度卷積層來自動進行原始數(shù)據(jù)中的特征學(xué)習(xí)。
手勢識別系統(tǒng)第一步需要在完成電腦攝像頭錄制手勢后,提取出手的輪廓線,利用OpenCV計算機視覺庫提高的API,編程完成圖像的預(yù)處理過程,對圖像去噪。對去噪后的手勢圖片進行膚色檢測和顏色空間轉(zhuǎn)換,以及圖像的二值化處理,然后再做進一步的腐蝕和膨脹等處理,最終提取目標對象的整體輪廓。整體流程圖如圖1所示。
圖1 手勢分割流程圖
由于采集圖像的背景環(huán)境復(fù)雜多樣,采集設(shè)備性能也各不相同,直接從電腦攝像頭采集到的手勢原始圖像中會包含大量的噪聲干擾,通常都需要執(zhí)行預(yù)處理操作來保持原始圖像信息的完整性。
在PyCharm編譯器上配置好OpenCV環(huán)境,然后在main.py源文件中進行手勢圖像的錄制,調(diào)用videoCapture函數(shù)捕獲攝像頭,進而獲取攝像頭中的實時手勢圖片。直接獲取到的手勢圖片受到環(huán)境因素,如光照強度、背景灰暗等影響,需要進一步處理才能夠保證圖片的有效信息和關(guān)鍵特征點,以及將原始圖片中對效果產(chǎn)生影響的或者與我們目標信息無關(guān)的特征剔除。對原始圖像的降噪也稱為濾波,目前研究中比較常用的濾波算法有均值濾波器、高斯濾波器、雙邊濾波等。此處選用雙邊濾波算法對原始的圖像進行降噪處理。
雙邊濾波的實質(zhì)是將像素領(lǐng)域的空間和像素值相近的區(qū)間結(jié)合起來,達到邊緣保持和去噪的目的。越是靠近中心點處坐標的像素點的灰度值占比權(quán)值越大,確保了邊界不會被模糊掉,它是一種簡單、非迭代和局部的算法。雙邊濾波法通過在內(nèi)部設(shè)定相應(yīng)的函數(shù)來達到對邊緣像素點保持和降噪的目的。
想要達到最終手勢識別的目的,其中有一個較為重要的步驟就是手勢分割,它是手勢識別的前提。此處采用膚色檢測的方法對手勢進行分割。手勢特征有很多,其中手部膚色是一項重要的特征,并且具有較強的魯棒性,屬于手部固有的特征。
RGB顏色空間是各種顏色模型的基礎(chǔ),R代表紅色,G代表綠色,B代表藍色?;赗GB的顏色空間模型的膚色檢測主要就是通過三個坐標軸的關(guān)系來判斷像素是否是膚色的像素范圍。
OpenCV中利用cvColor()函數(shù)轉(zhuǎn)換到RGB空間,然后利用split()函數(shù)獲取圖像中每個像素點的RGB值,即將一個二維矩陣拆成一個三維矩陣。判斷獲取的像素點是否在膚色的范圍之內(nèi),如果不在則將掩膜設(shè)置為黑色。除了RGB顏色空間模型之外,還有一種較為常見的顏色空間就是HSV(色彩飽和度模型),在OpenCV中將cvtColor函數(shù)參數(shù)改為cv2.COLOR_BGR2HSV,將顏色空間轉(zhuǎn)換到HSV空間。
即使是經(jīng)過膚色檢測算法分割出來的手勢圖[3],難免都會存在雜質(zhì)的缺陷點,也就是黑色的污點,所以需要進一步處理。形態(tài)學(xué)原理其實就是和“卷積”在圖像處理中的應(yīng)用一樣,就是一個“內(nèi)核”遍歷圖像之后進行處理。內(nèi)核的不同使得處理得到的圖像效果也是不同的。常見的形態(tài)學(xué)處理操作就是腐蝕和膨脹。
對于二值化圖像中為0的像素進行操作,以描點像素為中心,九宮格內(nèi)若有像素值非0,則將描點像素置1。膨脹就是提高高亮區(qū)域的面積,在卷積處理的時候求局部最大值,值越大,則亮度越大。在OpenCV中調(diào)用函數(shù)進行膨脹操作,首先設(shè)置卷積核函數(shù),然后調(diào)用OpenCV中的接口函數(shù)dilate。腐蝕和膨脹處理后的結(jié)果如圖2所示。
圖2 腐蝕和膨脹效果圖
輪廓是圖像的目標區(qū)域,此處對應(yīng)著手勢部分的邊界。邊界部分由一個個連續(xù)的像素點構(gòu)成,需要連接所有連續(xù)點的曲線,提取出手勢的輪廓,但是它們一般是相同的顏色或灰度值。輪廓是分析目標物體形狀以及目標對象檢測必需的手段。為了提高提取輪廓的精確度,需要先進行閾值處理或者是利用canny邊緣檢測方法將圖像轉(zhuǎn)換為灰度值為二值的圖像[4]。在進行膚色檢測之后,采用輪廓提取算法,能夠更好的勾畫出手勢的特征,識別更加準確。輪廓提取如圖3所示。
圖3 輪廓提取圖
特征提取就是根據(jù)目前的特征集創(chuàng)建一部分新的特征子集,也是從原始的特征集中根據(jù)多種特征建立映射關(guān)系,映射出一組新的特征集合。為此,要對上述部分提取的輪廓點坐標提取出對應(yīng)的傅里葉描述算子。由攝像頭采集的手勢圖像在獲取過程中,往往會存在圖像的尺寸大小無法把控且圖像角度傾斜等問題,需要對輸入的原始圖像進一步處理。每個手勢的整體輪廓也會不同,都對應(yīng)不同的特征點。
傅里葉算子主要作用是用來顯示圖像特征的一個參數(shù)。此處需要識別的目標對象的邊界是一系列連續(xù)的點,將這些提取出來的信息經(jīng)過傅里葉變換的處理,最后得到的就是手勢的特征點[5]。直接將三維空間的手勢圖片模型轉(zhuǎn)換為二維特征向量,便于后面的特征庫的建立。通過向量的各個不同的列的參數(shù)來描述每個特征的點。
對于目標邊界函數(shù)的選擇,采用的是復(fù)數(shù)坐標。在閉合界限的曲線上隨機選取一個點作為起始點,圍繞邊界去跟蹤監(jiān)測邊界線,用a+bj的復(fù)數(shù)形式去記錄各個點的位置。經(jīng)過一圈的計算后會得到一個復(fù)數(shù)的點的序列,得到基于不同手勢的特征描述曲線。手勢圖像的輪廓邊界是一個閉合的連續(xù)曲線,先已得到它的復(fù)數(shù)形式,而輪廓曲線坐標序列經(jīng)過傅里葉變換。對于一個封閉的邊界,其邊界在x、y方向的傅里葉級數(shù)可以展開為下式:
其中T表示周期。利用此公式對手勢圖片進行傅里葉變換計算,得到邊界的橢圓傅里葉描述子。取32項傅里葉算子的時候,重建效果如圖4所示?;究梢赃€原手勢形狀。
圖4 手勢還原圖
手勢識別的算法有很多種,簡單來說它就是一個分類的任務(wù),需要選擇合適的分類器讓機器可以學(xué)習(xí)手勢的特征[6]。早期,在統(tǒng)計學(xué)方法中,通常都是基于大樣本的數(shù)據(jù)實現(xiàn)理論,獲得想要的結(jié)果。
對于有限數(shù)量的學(xué)習(xí)樣本,通過持續(xù)減少結(jié)構(gòu)的問題,學(xué)習(xí)機器可以獲得最佳的分類能力,最后可以使用統(tǒng)計學(xué)方法去成功預(yù)測未知的結(jié)果。一般化世界可以在同一種類的函數(shù)集合中找到最佳的函數(shù),但是很難找到其他種類的函數(shù)。選擇樣本組的特征向量部分集合SVM以代替樣本組分割的SVM能夠較好解決上述問題。支持向量機構(gòu)建一個超平面,或無限維空間,該空間可用于分類、回歸,或?qū)Ξ惓V祵崿F(xiàn)檢測。SVC分類訓(xùn)練如下:
在配置好的軟件環(huán)境中進行手勢識別效果測試。復(fù)雜環(huán)境中[7]測試手勢1~10的識別效果,最后得到的手勢識別效果如圖5所示。
圖5 測試效果圖
在訓(xùn)練SVM模型基礎(chǔ)上與經(jīng)典的模板匹配的算法進行比較[8],對測試集中的200幅圖像輸入模型進行測試,統(tǒng)計每次識別結(jié)果,與原始的正確結(jié)果對比,得出常用的10種手勢平均識別率如表1。從表中可以看出,手勢4和手勢5的識別率比較低,其他手勢識別率都比較高,而且也經(jīng)過打印結(jié)果發(fā)現(xiàn)手勢5錯誤識別都是誤判成了手勢4,因為手勢4和手勢5在提取手勢特征時,兩者的橢圓傅里葉算子值相當接近,差異較小。除此之外,在采集手勢的時候所處的環(huán)境也產(chǎn)生了一部分的影響。
表1 各手勢識別率
基于對手勢識別理論方面的分析和探討,在系統(tǒng)設(shè)計方面實現(xiàn)了對人體手勢的準確識別和分類。研究主要在理論上做了實驗層面的試探,但若將手勢識別真正運用在現(xiàn)實生活中,可能還存在一定的缺陷。采用的膚色識別技術(shù)進行手勢分割,在復(fù)雜的現(xiàn)實情況中容易受到干擾,在復(fù)雜的環(huán)境中容易出現(xiàn)與人體膚色相近的物體以及與手勢相似的形狀,對準確率造成一定的影響。僅僅對10種常見手勢進行了分析,應(yīng)用范圍存在一定的局限性。后續(xù)研究中,可以進一步對模型進行改善與擴展,訓(xùn)練出更多操作的手勢,以提高適應(yīng)范圍。