向陽 詹明強





摘要:隨著科技的發(fā)展,計算機發(fā)展越來越快,人機交互手段也日新月異,而手勢控制與人臉識別作為一種新型的人機交互手段,有著便捷的特點。通過單個手指移動鼠標,兩個手指相互靠近來點擊,通過提取人臉面部中所具有的特征,通過增加特征值點和較流行的Open CV算法來提高精度,在現(xiàn)實生活中有很重要的實用價值。
關鍵詞:人臉識別 手勢控制 面部特征值 Open CV 攝像頭
Camera-based Face Recognition and Gesture Recognition and Control
XIANG YangZHAN Mingqiang
Abstract: With the development of science and technology, the development of computers is getting faster and faster, and the means of human-computer interaction are also changing with each passing day. As a new type of human-computer interaction means, gesture control and face recognition have the characteristics of convenience. Move the mouse with a single finger, and click with two fingers close to each other. By extracting the features in the face, the accuracy is improved by adding feature value points and the more popular Open CV algorithm. It has very important practical value in real life.
Key Words: Face recognition;Gesture control;Facialfeature value;Open CVCamera
隨著科技快速的發(fā)展,傳感技術已經(jīng)獲得質(zhì)的飛躍,人機交互的手段更加多樣,從傳統(tǒng)的鼠標、鍵盤輸入設備,到現(xiàn)在的指紋識別、人臉識別、瞳孔識別、手勢控制等方式,與傳統(tǒng)的方式相比更加方便、直觀。但由于人臉識別與手勢控制對圖像處理的算法要求很高,開發(fā)難度較大,現(xiàn)在人臉識別與手勢控制系統(tǒng)還不夠完善,都還處于發(fā)展狀態(tài)[1]。
1 人臉識別
1.1 系統(tǒng)的總體設計
本文設計的是一個智能交互式人臉識別系統(tǒng),主要有人臉錄入、人臉識別、收集未知人臉。
1.2 理論分析
1.2.1 人臉錄入分析
人臉錄入時,本文采用的是事先通過攝像頭對當前的人臉進行檢測,然后將人臉的特征值信息錄入數(shù)據(jù)庫,并將后面的未知人臉的信息錄入另一個數(shù)據(jù)庫,以便于人臉錄入系統(tǒng)的完善。
1.2.2 人臉識別
系統(tǒng)打開筆記本自帶的攝像頭,通過攝像頭采集的人臉圖像,把圖像信息進行轉(zhuǎn)換成特征信息,然后對圖片進行檢測,再與錄入的人臉進行比對,得出結(jié)果[2]。
1.3 算法設計
1.3.1 代碼的設計
對于人臉識別,主要采用Open CV和face_recognition庫,face_recognition是基于dlib進行了二次封裝,號稱世界上最簡潔的人臉識別庫。dlib有專門的函數(shù)和模型,能夠?qū)崿F(xiàn)人臉68個特征點的定位。代碼主要簡介如下。
load_image_file 這個方法主要用于加載要是別的人臉圖像,加載返回的數(shù)據(jù)是Numpy數(shù)組,記錄了圖片的所有像素的特征向量。
face_locations 定位圖片中所有的人臉的像素位置返回值是一個列表形式,列表中每一行是一張人臉的位置信息,包括[top,right,bottom,left]四方位坐標。每個人臉就是一組元組信息,主要用于表示圖像中所有的人臉信息
face_landmarks 識別人臉關鍵特征點參數(shù)仍然是待檢測的圖像對象,返回值是包含面部特征點字典的列表,列表長度就是圖像中的人臉數(shù)。面部特征包含以下幾個部分:nose_bridge(鼻梁)、right_eyebrow(右眼眉)、left_eyebrow(左眼眉)、right_eye(右眼)、left_eye(左眼)、chin(下巴)、nose_tip(人中、下鼻梁)、bottom_lip(下嘴唇)。
face_encodings 獲取圖像文件中所有面部編碼信息返回值是一個編碼列表,參數(shù)仍然是要識別的圖像對象。如果是后續(xù)訪問時,需要注意加上索引或遍歷進行訪問。每張人臉的編碼信息是一個128維向量。
面部編碼信息是進行人像對比的重要參數(shù)。
compare_faces 由面部編碼信息進行面部識別匹配用于匹配兩個面部特征編碼,利用這兩個特征向量的內(nèi)積來衡量他們的相似度,根據(jù)閾值確認是否是同一個人。
第一個參數(shù)就是一個面部編碼列表(很多張臉),第二個參數(shù)就是給出單個面部編碼(一張臉)。
compare_faces會將第二個參數(shù)中的編碼信息與第一個參數(shù)中的所有編碼信息依次匹配,返回值是一個布爾列表,匹配成功則返回true,匹配失敗則返回false,順序與第一個參數(shù)中臉部編碼順序一致。
1.3.2人臉識別的結(jié)果
圖1為用此方法的識別結(jié)果舉例。
當把頭像從人臉錄入系統(tǒng)刪除或者出現(xiàn)人臉錄入系統(tǒng)沒有的頭像時,會顯示圖2所示圖像。
1.4 結(jié)論
根據(jù)功能要求,將系統(tǒng)分為兩個部分,分別為人臉圖像的錄入、人臉識別和未知頭像的保存。人臉識別主要是先用攝像頭采集頭像,對采集的頭像進行特征值提取,再與錄入的部分圖像進行對比,使用OpenCV庫進行處理,來確定數(shù)據(jù)庫中的訓練好的樣本和現(xiàn)在攝像頭拍攝的頭像檢測出人臉最相似的,也可以用參數(shù)要求對設計的系統(tǒng)多次進行調(diào)試,可以提高準確率,同時具有靈敏度高、穩(wěn)定性強等特點[2-3]。
2手勢識別
2.1 手勢的表示
手勢的表示方法有很多種,常見的表示方法是將手勢表示成一個向量,如使用手心的坐標、輪廓中曲率較大的點等手勢特征組成的向量來表示。在手勢識別中,以輪廓中曲率較大的點作為特征點的魯棒性低,一方面是由于手在運動過程中存在變形,同一部分在相鄰兩幀圖像中的曲率往往存在較大差異;另一方面是由于這種方法對手勢分割的精度要求較高,很難適用于復雜背景、復雜光照的條件。此外,還有一種方法是使用直扳模型,它是人手物理結(jié)構(gòu)的一種簡化形式,能有效地描述人手的3D特征,但同時也有算法復雜、對手勢分割的精度要求高等缺點[4]。
本文將人手劃分成手掌、手指關節(jié)兩部分,使用結(jié)構(gòu)分析的方法來表示手勢,這兩部分描述手勢的角度和層次不同,是一種從整體到局部逐漸細化的表示法;手掌可以作為一點(手心)或一塊來表示整個手,而手指的關節(jié)則較為詳細地描述人手信息[4]。
2.2 手勢獲取的技術
手勢獲取技術主要分為兩類:基于視覺技術,主要靠攝像機進行手勢識別與跟蹤;基于可穿戴的手套、戒指、手鐲等設備輸出的數(shù)據(jù)進行識別。這兩類方法的主要區(qū)別在于;基于視覺的技術無干擾或者少干擾,用戶不需要戴傳感器,可以用手進行交互,更符合用戶的交互習慣;而基于可穿戴設備的技術需要在手上安裝其他傳感器,對用戶有干擾[5]。本文采用關節(jié)等效距離特征識別方法[6],將通過對手指的各個關節(jié)彎曲的角度,利用21個關節(jié)的相關數(shù)據(jù),對這21個關節(jié)點組成的手,先通過攝像頭提取手的特征信息,構(gòu)造一種有效距離特征和手指伸直程度特征,根據(jù)不同手勢對應不同的特征信息進行手勢識別[6]。
2.3手勢識別結(jié)果
手勢識別前先建立可能出現(xiàn)結(jié)果的數(shù)據(jù)庫,數(shù)據(jù)庫為1到5這5位數(shù)的5張手勢照片,本文只以1到5這5個數(shù)做簡單的舉例,通過筆者筆記本電腦自帶的攝像頭拍攝的圖像,追蹤到手部區(qū)域?qū)κ植康?1個關節(jié)點進行分析,得到這21個關節(jié)點的三維坐標,再通過圖像分析得到與數(shù)據(jù)庫內(nèi)最相似的圖片,并最后返回一個數(shù),結(jié)果如圖3、圖4所示。
2.4 結(jié)論
本文用OpenCV算法,從實時視頻流中讀取手部關節(jié)點信息,并且對這21個關節(jié)點進行分析,得出基于關節(jié)點等效距離特征和手指伸直程度和關節(jié)點的位置數(shù)量的手勢識別方法,并與數(shù)據(jù)庫中的圖像進行對比,得出結(jié)果,結(jié)果表明了此方法的有效性,相比于傳統(tǒng)的Kinect方法,此方法更加簡便、有效,實用性更高。
3手勢控制
3.1 研究背景
隨著科技的發(fā)展,人們和社會對“智能化”的需求越來越大,而人機交互已經(jīng)成為主要的“智能化”方式,也成為人們研究的重點。人機交互主要有以上研究的人臉識別、手勢識別,以及接下來要研究的手勢控制等。手勢控制需要借助于手勢識別,對攝像頭拍攝的圖像序列進行分析處理。當今國內(nèi)外有許多種研究手勢控制的傳統(tǒng)方法,如穿戴數(shù)據(jù)手套、采用RealSense 3D攝像頭采集圖像進行圖像處理[7]。而本文則借助簡單的筆記本電腦自帶的攝像頭進行手勢控制。
3.2 系統(tǒng)方案
本文采用Python3.6版本借用Autopy 、Numpy和OpenCV等函數(shù)庫對手勢的特征值信息進行提取,并實現(xiàn)手勢運動時的運動特征提取提取,得到21個關節(jié)點的三維坐標信息,再檢測是否只有食指伸出,若只有食指伸出,則進入移動模式。通過攝像頭拍攝的食指的位置,就可以得到食指的“關節(jié)點”的三維坐標信息,并將食指的坐標信息轉(zhuǎn)化為鼠標在桌面的信息。當食指的“關節(jié)點”運動到某個位置時,再檢測食指和中指是否都伸出,若食指和中指都伸出,則檢測食指和中指兩指尖的“關節(jié)點”的距離,若果距離短到一定的值時則對應為鼠標的點擊。
3.3 動態(tài)手勢的獲取
由于攝像頭拍攝手勢圖像時容易受到手勢的背景等各種外部環(huán)境的影響,而要從各種不同或復雜多變的環(huán)境中提取中手勢位置、形狀的改變,就必須要考慮背景顏色、物體與攝像頭的距離等因素的影響。因此,借用一種比較簡單但實用的方法來盡可能減少噪聲干擾[8]。
借用背景差分法,通過攝像頭拍攝圖像與背景的圖像進行對比,得出運動的目標。首先要有一個明亮干凈的背景,如果在黑暗環(huán)境下,手勢的提取效果會變差。用攝像頭拍攝的視頻中某一幀圖像和背景圖像進行差分運算,并將計算的結(jié)果存入一個新的圖像中去。在新得到的圖像中,如果像素的值大于一個特定的閾值,則認為視頻圖像中在相同位置的像素屬于運動目標區(qū)域;若像素的值小于或等于一個特定的閾值,則認為視頻圖像中在相同位置屬于背景區(qū)域,通過此方法就可以提取運動的手勢[8]。提取運動的手勢后,再通過Open CV函數(shù)得到手勢的幾何特征,即先根據(jù)手勢識別得到的21個關節(jié)點的三維坐標信息,對這21個掛節(jié)點進行建模,得到關節(jié)點的信息為M,可以表示為[6]:
M ?(1)
其中, 表示第i個關節(jié)點的j分量的值。計算除0節(jié)點外,每兩個節(jié)點的距離D,其公式為:
(2)
同時,為了減小不同人的手大小可能不同,所以我們進行標準化處理,其計算公式為:
(3)
其中, 表示關節(jié)點m到關節(jié)點n的等效距離。
3.4 動態(tài)檢測手勢的優(yōu)化
現(xiàn)實生活中的動態(tài)手勢的檢測中,大多數(shù)情況下要求算法能夠在沒有人為干預下,自動進行手勢的檢測。而這對程序和算法的要求非常高,對攝像頭采集圖片的精度依賴性很高。再加上外界環(huán)境中光照等復雜環(huán)境的影響,使得攝像頭檢測手勢的移動很困難。
本文在手勢檢測處理的步驟中,利用傳統(tǒng)的機械學習的方法構(gòu)造出手部關節(jié)點的特征,在用基于骨架的動態(tài)手勢識別方法,此方法提取4種手部形狀特征和手部方向特征,在輸入線性SVM分類器進行識別[5],得出21個關節(jié)點特征信息,比普通的特征值提取效果更好。
3.5 實驗結(jié)果
通過用Python3.6版本和OpenCV算法,系統(tǒng)Win10,攝像頭為筆記本自帶的攝像頭,手勢控制結(jié)果如圖5和圖6所示。
如圖5所示,當只有一個食指的時候,會在食指的指尖顯示一個“紅色的小點”,這時則可以通過攝像頭拍攝的照片來捕獲食指的三維坐標,代替鼠標指針的移動;當伸出食指和中指時,此時食指則不能控制鼠標的移動,但如圖6所示,在食指和中指的指尖處會出現(xiàn)一條“紅線”用來測量兩值間的距離,當兩指尖的距離小于某個值時,就會出現(xiàn)圖5所示的現(xiàn)象,此時表示鼠標的點擊,從而完成簡易的鼠標控制。
3.6 結(jié)論
本文從上面介紹的手勢識別和本實驗的手勢控制的整體流程,關節(jié)點的設置、測量、和OpenCV算法的實現(xiàn),以及手勢獲取的優(yōu)化等等方法,最后實驗證實基于OpenCV的手勢識別算法有一定的簡易性和準確性。隨著人機交互方式的不斷升級,手勢控制將在不久的將來應用越來越廣泛,同時手勢控制也將給人們帶來更多的便捷之處。
4結(jié)語
隨著科技的飛速發(fā)展,人們不斷追求“智能化”,本文通過本電腦自帶的普通攝像頭,首先捕獲人臉,進行臉部特征值的提取,采用OpenCV算法,與建立的錄入人臉數(shù)據(jù)庫內(nèi)的人臉進行對比后,找到最相似的人臉,同時發(fā)現(xiàn)未知人臉也可以保存下來,以便以后完善錄入人臉的數(shù)據(jù)庫,然后得出結(jié)果,結(jié)果發(fā)現(xiàn)準確率很高。再通過攝像頭拍攝的視頻得到手部的21個“關節(jié)點”,采用基于關節(jié)點等效距離特征和手指伸直程度和關節(jié)點的位置數(shù)量的手勢識別方法,并采用OpenCV算法進行幾何特征提取得到每個“關節(jié)點”的三維坐標信息,根據(jù)三維坐標信息與實現(xiàn)建立的手勢數(shù)據(jù)庫內(nèi)進行特征信息的對比,得出手勢代表的數(shù)字,然后得出簡單的手勢識別結(jié)果。最后在手勢識別的基礎上,借用手勢識別和OpenCV算法,再利用傳統(tǒng)的機械學習的方法構(gòu)造出手部關節(jié)點的特征,通過基于骨架的動態(tài)手勢識別方法優(yōu)化手勢的識別,得到21個“關節(jié)點”的坐標信息,并用食指的移動代表鼠標的移動,中指和食指之間的距離代表鼠標的左鍵(確定鍵),最后完成簡易的手勢控制。這3個實驗在算法上有一定的相似之處,相輔相成,推動了人機交互的發(fā)展,在人機交互中有重要的借鑒意義。
參考文獻
[1]夏梓璐,譚方敏,李靜.基于手勢控制的鼠標設計[J].信息與電腦:理論版,2021,33(9):134-137.
[2]李成勇,王莎,陳成瑞.基于OpenCV的人臉識別系統(tǒng)設計與實現(xiàn)[J].國外電子測量技術,2021,40(11):168-172.
[3]邵曉康,張恒,田春子,等.OpenCV算法的人臉識別在課堂簽到系統(tǒng)上的分析與研究[J].電子世界,2021(23):31-32.
[4]朱繼玉,王西穎,王威信,等.基于結(jié)構(gòu)分析的手勢識別[J].計算機學報,2006(12):2130-2137.
[5]張維,林澤一,程堅,等.動態(tài)手勢理解與交互綜述[J].軟件學報,2021,32(10):3051-3067.
[6]張遠來,王傳江,黃燦.基于Realsense的手勢識別與應用[J].計算機工程與設計,2019,40(03):839-844,873.
[7]胡茜. 基于深度學習的三維手勢識別模型的研究與應用實例[D].昆明:云南大學,2017.
[8]賁永明,管孟凌,李丹陽,等.智能手勢控制系統(tǒng)的算法實現(xiàn)[J].中國科技信息,2014(1):95-97.