陳敬宇 徐金 羅容 張樂樂 姜哲


收稿日期:2023-04-04
DOI:10.19850/j.cnki.2096-4706.2023.22.019
摘? 要:隨著計算機(jī)視覺技術(shù)的發(fā)展,人與計算機(jī)的信息交互也是必不可少的一部分。因新冠病毒的傳播,“隔空”操作的方式得到多元化發(fā)展。該系統(tǒng)通過單目攝像頭捕捉手部位置信息,基于MediaPipe框架構(gòu)建手部模型并完成手勢識別功能,達(dá)到“隔空”操控鼠標(biāo)的效果,此外為展示更真實,該系統(tǒng)基于Unity軟件實現(xiàn)實時的手部3D效果展示。該系統(tǒng)手勢識別效率較高,達(dá)到了良好的性能及視覺效果。
關(guān)鍵詞:MediaPipe;虛擬鼠標(biāo);Unity3D;手勢識別
中圖分類號:TP391.4;TP311? 文獻(xiàn)標(biāo)識碼:A? 文章編號:2096-4706(2023)22-0088-04
3D Human-computer Interaction System Based on Gesture Recognition
CHEN Jingyu, XU Jin, LUO Rong, ZHANG Lele, JIANG Zhe
(College of Computer and Information Engineering,Xinjiang Agriculture University, Urumqi? 830052, China)
Abstract: With the development of computer vision technology, the information interaction between human and computer is also an indispensable part. Due to the spread of COVID-19 virus, the “empty space” operation has been diversified. The system captures the hand position information through a monocular camera, uses the MediaPipe framework to build the hand model and complete the gesture recognition function, so as to achieve the effect of controlling the mouse from “empty space”. In order to display more realistically, the system realizes real-time hand 3D effect display based on Unity software. The system has high efficiency of gesture recognition and achieves good performance and visual effect.
Keywords: MediaPipe; virtual mouse; Unity3D; gesture recognition
0? 引? 言
隨著計算機(jī)視覺技術(shù)的迅速發(fā)展,人機(jī)交互的方式越來越豐富,其應(yīng)用也更深入生活。傳統(tǒng)的人機(jī)交互一般是基于顯示器、鼠標(biāo)和鍵盤的交互方式,人通過鼠標(biāo)、鍵盤或其他輸入設(shè)備對機(jī)器發(fā)送指令信息,機(jī)器再嚴(yán)格按照指令行動,通過顯示器向人傳遞反饋信息。然而傳統(tǒng)的人機(jī)交互方式已不能滿足需求,人們追求更便捷、更簡單、更貼合現(xiàn)實生活的交互方式[1]。因新冠 病毒傳播,基于人工智能的“無接觸式”的人機(jī)交互方式興起,更是促進(jìn)了手勢識別的發(fā)展。手勢作為一種符人們?nèi)粘2僮髁?xí)慣的非接觸式信息交流和交互方式,與傳統(tǒng)的基于鼠標(biāo)、鍵盤與觸摸屏等接觸式交互方式相比,不易造成設(shè)備污染,同時可進(jìn)行遠(yuǎn)距離交互。手勢識別也被認(rèn)定為最自然最高效的交互方式[2]。
本文實現(xiàn)了基于手勢識別的3D人機(jī)交互系統(tǒng),采用單目攝像頭實時讀取當(dāng)前手部狀態(tài)信息并不斷跟蹤手部位置,通過分析手部位置變化信息來模擬鼠標(biāo)的移動,達(dá)到了“隔空控制”鼠標(biāo),并使用三維結(jié)構(gòu)視覺實時顯示手部變化的效果,捕獲桌面實時動畫并與3D手勢結(jié)合展示。
1? 技術(shù)介紹
1.1? MediaPipe
MediaPipe是一款由Google開發(fā)并開源的數(shù)據(jù)流處理機(jī)器學(xué)習(xí)應(yīng)用開發(fā)框架[3],主要用于處理構(gòu)建使用了多種形式的數(shù)據(jù)源(如視頻、音頻和各種其他傳感器數(shù)據(jù)和時間序列數(shù)據(jù))[4]。MediaPipe手勢識別采用由多個模型組成的ML(機(jī)器學(xué)習(xí))管道。其主要獲取手部位置,截取整個手掌的信息,返回進(jìn)行下一步手部特征點的檢測,對于獲取的手掌完整信息,再一次細(xì)分獲取每個特征點的3D地標(biāo),通過獲取得到的21個手部特征點的3D地標(biāo)。
1.2? Unity 3D
本系統(tǒng)需要通過攝像頭將獲取的手部位置信息以3D的形式展示到顯示器,Unity作為實時3D互動內(nèi)容創(chuàng)作和運(yùn)營平臺[5],其提供了豐富且強(qiáng)大的各類功能,幾乎市面上所有的主流游戲平臺Unity都支持,因此,選用Unity作為此次手部識別3D展示軟件。
2? 系統(tǒng)設(shè)計
2.1? 系統(tǒng)框架設(shè)計
通過OpenCV完成圖像及視頻數(shù)據(jù)的讀取,將幀數(shù)據(jù)傳入給MediaPipe,構(gòu)建手部模型,標(biāo)出手部21個3D地標(biāo)顯示在圖像上。在圖像顯示框中單獨規(guī)劃出虛擬鼠標(biāo)操作區(qū)域,其范圍大小與電腦顯示桌面成映射關(guān)系,因此可完成“隔空控制”效果,同時將手部位置信息和系統(tǒng)桌面的實時畫面數(shù)據(jù)傳輸?shù)経nity軟件中,構(gòu)建3D模型。圖1為功能原理圖。
2.2? 虛擬鼠標(biāo)工作原理
鼠標(biāo)是否移動判定方法如下:設(shè)定僅有食指伸出,其余手指握拳,則判定鼠標(biāo)移動;設(shè)定當(dāng)食指和中指同時伸出,其余手指握拳且兩指指尖距離大于70像素,則判定鼠標(biāo)不移動,兩指指尖距離小于70像素,則判定鼠標(biāo)左鍵點擊一下;當(dāng)食指中指和無名指三指同時伸出,其余手指握拳,則判定鼠標(biāo)右鍵點擊一下。
3? 功能實現(xiàn)
3.1? 構(gòu)建手部模型
本系統(tǒng)核心部分是獲取21個手部特征點坐標(biāo),OpenCV庫將捕捉到的每一幀的圖像進(jìn)行處理后獲取手部位置坐標(biāo),并對坐標(biāo)進(jìn)行處理。該模塊創(chuàng)建handDetector類,用于實現(xiàn)圖像處理方法,該類中包含了以下四個核心方法。下面將詳細(xì)介紹每個方法。
findHands()方法:該方法用于返回手部位置信息。通過OpenCV將幀圖像從BGR格式轉(zhuǎn)成RGB格式,將數(shù)據(jù)輸入MediaPipe框架內(nèi)置方法獲取手部21個地標(biāo);然后通過畫線連接該21個地標(biāo),顯示手部“特征”形狀;最后返回當(dāng)前幀圖像,顯示手部位置。
findPosition()方法:該方法繪制手部位置。在findHand()方法中取得的手部位置信息,分別放入x、y、z列表中,此特征點的坐標(biāo)是以圖像左上角為原點的坐標(biāo)系所獲取的,因此需要獲取當(dāng)前圖像的長寬。根據(jù)OpenCV圖像的大小返回相對應(yīng)的21個特征點的坐標(biāo),根據(jù)特征序列號,將特征點坐標(biāo)及序列號有序放在列表中。方便用戶觀察手部位置,通過獲取的手部位置信息,提取21個橫縱坐標(biāo)中的最大、小值,基于此數(shù)據(jù)繪制綠色顯示框,環(huán)繞在手部周圍,并返回相關(guān)列表信息。
fingersUp()方法:該方法判定手指是否伸出。MediaPipe框架提供的21特征點結(jié)構(gòu)圖中4、8、12、16、20五個點位為五個手指的指尖。針對本系統(tǒng),需要通過觀察手指的運(yùn)動來判斷是點擊還是移動鼠標(biāo),因此作為手指代表的指尖,需要對其進(jìn)行坐標(biāo)數(shù)據(jù)分析。對于大拇指,其自然伸出方向并不平行于y軸,因此對其伸出或握拳的判定為與大拇指尖下方的3號特征點進(jìn)行x軸坐標(biāo)大小的比較。對于右手而言,自然條件下在圖像上,大拇指尖橫坐標(biāo)比3號特征點的橫坐標(biāo)要小,此時判定其自然伸出,當(dāng)其橫坐標(biāo)大于3號特征點,判定其握拳;對于其余四指,大都平行于y軸,因此當(dāng)其指尖縱坐標(biāo)小于指尖下方特征點的縱坐標(biāo)時,判定其為握拳狀態(tài),相反,判定為伸出狀態(tài)。創(chuàng)建列表fingers[],添加五個手指的當(dāng)前狀態(tài),用1表示伸出,0表示握拳,fingersUp()方法返回fingers列表。
findDistance()方法:該方法通過傳入兩特征點相對坐標(biāo),計算兩點之間的距離和中間點坐標(biāo)。放大兩特征點的實心小球,在兩點的中點繪制紅色的小球,三點通過紅線相連。此方法用于鼠標(biāo)點擊功能,由虛擬鼠標(biāo)工作原理可知,僅食指伸出時,虛擬鼠標(biāo)處于移動狀態(tài);當(dāng)食指和中指共同伸出,代表鎖定狀態(tài)。當(dāng)兩點指尖距離小于或大于某一值時,兩點中點繪制的小球顏色發(fā)生變化,用來顯示虛擬鼠標(biāo)點擊效果。
3.2? 虛擬鼠標(biāo)功能
虛擬鼠標(biāo)是一個持續(xù)性的實時過程,因此所有的操作都需要在循環(huán)中完成,通過OpenCV庫VideoCapture()方法打開攝像頭獲取實時狀態(tài),并調(diào)用handDetector類的findHands()方法獲取當(dāng)前手部狀態(tài)信息,在圖像上連出21個特征點的線圖。繼續(xù)調(diào)用findPosition()方法獲取21個手部特征點地標(biāo)列表,將繪制手部位置顯示框且框選出當(dāng)前手部的位置。
3.2.1? 鼠標(biāo)移動
根據(jù)已有的特征點位置信息進(jìn)行判斷,為了避免浪費系統(tǒng)資源,需要先對findPosition()方法返回的信息列表進(jìn)行判斷,當(dāng)存在特征點時,才啟動虛擬鼠標(biāo)功能。當(dāng)檢測到有手部的8號特征點(食指指尖),且僅有手部的8號特征點伸出時,8號特征點的紅色實心小球會被放大,此時桌面的鼠標(biāo)會隨著手部的食指在操作區(qū)域的移動而移動??刂铺摂M鼠標(biāo)的前提即是檢測到手部信息。但在系統(tǒng)設(shè)計的過程中發(fā)現(xiàn),當(dāng)使用者想要控制鼠標(biāo)到桌面最下方時,此時系統(tǒng)會因檢測不到手部信息而無法控制虛擬鼠標(biāo),僅食指存在的情況下,無法獲取完整的手部位置信息。因此繪制一個寬度小于OpenCV圖像的紅色操作框顯示在圖像中,當(dāng)作虛擬鼠標(biāo)的操作區(qū)域,即使手部位置超出矩形框也不會影響虛擬鼠標(biāo)的移動。此外,因為攝像頭為鏡面效果,且此效果只針對x軸坐標(biāo),因此對獲取得到的x軸坐標(biāo),需進(jìn)行取反操作,獲取當(dāng)前攝像框的長寬,用攝像框的寬減去當(dāng)前的x軸坐標(biāo),則可達(dá)到一個取反的效果。
3.2.2? 鼠標(biāo)點擊
實現(xiàn)虛擬鼠標(biāo)的點擊,與虛擬鼠標(biāo)的移動同理,當(dāng)僅有食指與中指伸出的情況下,暫停虛擬鼠標(biāo)的移動,當(dāng)兩指尖的距離小于70像素時,鼠標(biāo)左鍵點擊,兩指尖之間繪制的圓填充綠色。指尖距離大于70像素時,顯示為藍(lán)色。食指中指和無名指同時伸出時,代表鼠標(biāo)右鍵點擊。關(guān)鍵代碼如下:
if left == 0:
if length < 70:
cv2.circle(img, (lineInfo[4], lineInfo[5]),15, (0, 255, 0), cv2.FILLED)
autopy.mouse.click()
left = 1;
if fingers[1] == fingers[2] == fingers[3] == 1 and fingers[0] == 0 and fingers[4] == 0:
length,img,lineInfo = detector.findDistance
(8,12,img)
if right == 0:
autopy.mouse.click(autopy.mouse.Button.RIGHT)
right = 1
3.3? MediaPipe與Untiy通信
當(dāng)啟動系統(tǒng)時,同樣為避免浪費系統(tǒng)資源,通過findHands()方法判斷當(dāng)前是否捕捉到手部信息,當(dāng)有手部位置信息時,獲取包含手部位置坐標(biāo)信息的列表。在Unity軟件中,其3D建模的坐標(biāo)系中y軸方向與攝像框中y軸方向相反,因此對于所有特征點的y軸坐標(biāo)均做取反處理,即獲取攝像框長寬,用長減去y軸縱坐標(biāo)即可,將取反后的y軸坐標(biāo)與x、z軸坐標(biāo)重新添加至數(shù)據(jù)列表中。通過調(diào)用socket方法完成手部特征點坐標(biāo)信息的傳輸。
3.4? Unity 3D建模
在Unity中,采用的是3D模型,因此其需要x、y、z三維坐標(biāo)來完成建模。首先建立模型,一共有21個特征點,需要21個cube物體充當(dāng)特征節(jié)點,節(jié)點之間同樣需要21個line來連接,因此對于每個line需要添加位置腳本LineCode,在其中初始化lineRender即線渲染器,聲明線起始位置與終止位置的寬度,以及定義初始位置和終止位置,此處每個line需要填寫0-20特征點。先前設(shè)置的21個cube和line都需要在一個父物體下,因為二者是一個相對關(guān)系,需要在一個父物體下才能隨著傳入的坐標(biāo)數(shù)據(jù)顯示完整的手部模型,并且cube與line的數(shù)據(jù)是相通的。
通過調(diào)用UDPReceive腳本,添加到整個手部模型上。在此腳本中定義與服務(wù)器端口相同的端口號,開啟一個新線程用來不斷接收傳入的坐標(biāo)數(shù)據(jù),將接收到的數(shù)據(jù)添加至字節(jié)數(shù)組dataByte中,再對其進(jìn)行轉(zhuǎn)譯處理,將字節(jié)數(shù)組轉(zhuǎn)成UTF-8編碼的字符串至data中。
手部模型上再次添加HandTracking腳本,用來更新21個坐標(biāo)的位置信息,通過調(diào)用UDPReceive腳本,獲取data字符串,并對其數(shù)據(jù)進(jìn)行分組處理,將數(shù)據(jù)從字符串型轉(zhuǎn)換成float類型。最后設(shè)置相對父節(jié)點的物體位置,不斷更新位置信息,完成3D手部模型的建立。
關(guān)鍵代碼如下:
client = new UdpClient(port);
IPEndPoint anyIP = new IPEndPoint(IPAddress.Any, 0);
byte[] dataByte = client.Receive(ref anyIP);
data = Encoding.UTF8.GetString(dataByte);
3.5? Unity虛擬桌面
本系統(tǒng)中使用windows提供的Desktop Duplication API接口捕獲windows系統(tǒng)當(dāng)前的桌面到unity的平面中進(jìn)行顯示,搭建一個實時的虛擬桌面。因Desktop Duplication API是通過Microsoft DirectX Graphics Infrastructure(DXGI)來提供桌面圖像,因此需要獲取到IDXGI Output Duplication接口,也是最重要的一部分。調(diào)用接口中使用到了D3D11和DXGI兩個庫文件,先獲取D3D和DXGI設(shè)備并初始化。獲取適配器和適配器列表。獲取桌面圖像需調(diào)用AcquireNextFrame獲取當(dāng)前桌面數(shù)據(jù)。因數(shù)據(jù)格式問題,并不能直接讀取IDGIResource格式的圖像,需要將圖像數(shù)據(jù)轉(zhuǎn)換成DX紋理形式后可在unity的平面中顯示。
4? 系統(tǒng)實現(xiàn)
在系統(tǒng)運(yùn)行時,會顯示兩個界面,分別是手部識別界面和3D顯示界面,如圖2所示。在手部識別界面,識別手部信息,來完成虛擬鼠標(biāo)的控制,實現(xiàn)鼠標(biāo)移動、點擊等功能;在3D顯示界面中,包含桌面實時顯示和手部模型兩部分,顯示界面會實時更新windows桌面的數(shù)據(jù);手部模型會同步單目攝像頭捕捉的手部動作信息,通過socket通信傳輸手部坐標(biāo)信息到3D界面,此外手部模型也可完成簡單的3D動作,如揮拳,前后移動,握手等。
5? 結(jié)? 論
本系統(tǒng)基于MediaPipe的機(jī)器學(xué)習(xí)框架,實現(xiàn)了虛擬鼠標(biāo)及3D效果展示功能。其核心部分為手勢識別的21個特征點坐標(biāo)的獲取,在此基礎(chǔ)上,對手部信息進(jìn)行處理,判斷當(dāng)前手部狀態(tài),使用者在虛擬鼠標(biāo)的操作區(qū)域?qū)崿F(xiàn)移動選擇、點擊等功能,反應(yīng)靈敏、延遲較低。在日常生活中使用本作品來實現(xiàn)遠(yuǎn)程控制虛擬鼠標(biāo)已然滿足使用需求。
本系統(tǒng)可廣泛應(yīng)用在多個場景,如醫(yī)院無接觸使用電子設(shè)備,銀行的業(yè)務(wù)辦理機(jī)等公共場合、VR沉浸式應(yīng)用、手語交流等場景。本系統(tǒng)同步3D效果展示延時較低,可更好的結(jié)合VR虛擬設(shè)備,實現(xiàn)最自然的人機(jī)交互,給使用者帶來最自然真實的交互體驗。
參考文獻(xiàn):
[1] 宋一凡,張鵬,劉立波.基于視覺手勢識別的人機(jī)交互系統(tǒng) [J].計算機(jī)科學(xué),2019,46(S2):570-574.
[2] 崔虎. 面向動態(tài)手勢識別的異步特征表示與時空正則化算法研究 [D].貴陽:貴州大學(xué),2022.
[3] 李輝,蘆利斌,金國棟.基于手勢識別的四旋翼控制系統(tǒng) [J].現(xiàn)代計算機(jī):專業(yè)版,2015(25):56-59+67.
[4] 方霽,鄭倩,王一梅,等.關(guān)于云導(dǎo)播臺交互方式的探討 [J].廣播電視信息,2021,28(8):22-25.
[5] 張俊,魏寧宇.基于數(shù)字孿生技術(shù)的《機(jī)械手驅(qū)動技術(shù)》應(yīng)用 [J].數(shù)字技術(shù)與應(yīng)用,2022,40(12):120-122.
作者簡介:陳敬宇(2003—),男,河南濮陽人,本科
在讀,主要研究方向:物聯(lián)網(wǎng)工程。通訊作者:徐金(1989—),女,新疆伊犁人,講師,專任教師,碩士研究生,主要研究方向:人工智能。