?

基于手勢識別的二軸輪式智能小車控制

2023-03-05 09:37,朱,張
江蘇工程職業技術學院學報 2023年4期
關鍵詞:右轉左轉關鍵點

鄒 龍 華 ,朱 永 強 ,張 平 霞

(青島理工大學機械與汽車工程學院,青島 266520)

0 引言

手勢識別是指通過計算機攝像頭等光學傳感器識別人手(或手和臂的組合)姿態或動作并判斷其意義后進行人機交互的技術。為使人機交互變得更加順暢,一些研究人員采用OpenCV(一個基于Apache 2.0 許可(開源)發行的跨平臺計算機視覺和機器學習軟件庫)對手勢動作進行識別及跟蹤,通過MediaPipe 技術實時生成手掌檢測模型及手部坐標模型,將手勢實時跟蹤結果計算出來并傳遞給計算機,以實現基于手勢識別的人機交互。[1-2]文獻[2]設計了一種基于WiFi 的手勢控制識別系統,根據WiFi 定位算法計算手勢設備佩戴者與多種智能設備之間的距離,選定接收設備;由手勢設備的加速度感應器收集手勢數據,并通過滑動均值濾波算法進行數據預處理,對所截取出的數據采用DTW(Dynamic Time Warping,動態時間歸整,簡稱DTW)算法,將手勢信息和手勢庫的數據進行匹配,從而獲得特征手勢信息;將特征手勢信息轉換成指令,通過WiFi 模塊發送信號給被控制設備,最終實現了8 種手勢的判別并控制多種設備的運行,手勢識別率達到98%。文獻[3]以MSP430 單片機為主控器,以FDC2214 傳感器為檢測核心,實現了學習和判決兩種工作模式。文獻[4]根據MediaPipe 技術研究了一種通過構建目標手部模型、關鍵點定位和數字手勢識別模塊實現數字手勢識別的方法。文獻[5]提出一種結合手勢的整體移動與部分手指移動的識別模式,根據此模式對DHG-14/28 動態手勢數據集中14 類手勢和28 類手勢進行實驗,分類識別準確率分別為98.57%和88.29%。上述手勢識別方法在實際應用中對硬件和軟件的要求高,操作不夠簡便?;诖?,本文提出一種硬件配置成本低且操作簡便的基于手勢識別的小車控制方法。

1 硬件配置

二軸輪式智能小車主要由Arduino Nano 單片機、攝像頭、電源、4 個電機、車架板、控制模塊和4 個橡膠車輪組成。Arduino Nano 是具有USB 接口的Arduino 小型版本,采用無電源插座和Mini-B 型的USB 接口,板型小巧,核心處理器是ATmega168(Nano 2.x)和ATmega328(Nano 3.0),供電方式主要有mini-B USB 接口供電和pin27 +5 V 接外部直流5 V 電源兩種。在此實驗中采用外接+5 V 電源的方式給Arduino Nano 供電。[6]如圖1 所示,兩組車輪分別安裝在兩組電機轉軸上,使電機能夠帶動車輪旋轉,圖1 中兩組電機安裝在車架板的兩側,對稱分布,攝像頭安裝在車架板的前部正中央,便于識別手勢,Arduino Nano 單片機、控制模塊和電源均被固定在車架板的上面。

圖1 二軸輪式智能小車

2 軟件控制系統

整個軟件控制系統可分為兩部分:①基于攝像頭的手勢攝取模塊,主要通過小車攝像頭攝取外部手勢并將圖像信息傳遞給Arduino Nano 單片機。②二軸輪式小車的下位機軟件控制系統,主要是通過在Arduino Nano 單片機中運行的Python 代碼對手勢攝取模塊傳遞過來的手勢圖像進行手部坐標標記,并對坐標點之間的距離和實時跟蹤結果進行計算處理,再將計算結果傳遞給計算機控制模塊,隨后控制模塊根據計算結果來控制小車進行前進、后退、左轉、右轉和停止。在運行程序進行手勢識別的過程中,做出前進、后退、左轉和右轉的手勢時,食指、中指、無名指和小拇指的斜率是相同的,攝像頭檢測到手部關鍵點后,將會進入循環開始處理每個檢測到的手部關鍵點,并獲取每個關鍵點的坐標,將坐標存儲在xs 和ys數組中。然后,在圖像上繪制關鍵點的圓圈和標注;再調用g_count 函數來計算手部特征值,并根據特征值輸出不同命令。

以前進手勢程序代碼為例,含義為4 個絕對值差值的和小于4.5、0 點到12 點之間的距離大于100 mm且中指斜率大于2,部分程序代碼為:

if(bs0+bs1+bs2+bs3)<4.5 and dis>100 and bs[1]>2:print("前進")#前進左手掌心向前

elif(bs0+bs1+bs2+bs3)<4.5 and dis>100 and -1<bs[1]<0:print("左轉")#左轉右手五指并攏指向左邊

elif(bs0+bs1+bs2+bs3)<4.5 and dis>100 and0<bs[1]<1:print("右轉")#左手五指并攏指向右邊

elif(bs0+bs1+bs2+bs3)>4.5 and dis>100 and bs[1]<-2:print("后退")#后退右手掌心向前

elif dis<100 and bs[1]<-1:

print("停止")#停止握拳

本次實驗采用Python 3.9 軟件,所需的庫包括OpenCV、Mediapipe、Time、Math、Cmath。其中OpenCV是視覺庫,用于處理圖像和視頻;Mediapipe 是一個集成的機器學習視覺算法工具庫,在此實驗中通過Mediapipe 對手部進行識別追蹤,再利用手部21 個坐標點的位置計算,實現手勢識別功能;Time 用于計算幀率;Math 和Cmath 用于進行數值計算。實驗創建了3 個空列表xs、ys、bs,分別用于存儲手部關鍵點的x坐標、y坐標和手部關鍵點的相關計算值的數組,然后使用for 循環初始化這些列表,具體函數實現如下:

xs =[]

ys =[]

bs =[]

#大小為21 的數組初始化

for i in range(0,21):

xs.append(0)

ys.append(0)

for i in range(0,4):

bs.append(0)

定義了名為two_point_distance 的函數,用于計算兩點之間的距離;定義了g_count 的函數用于計算手部的特征值;并使用sqrt 函數來計算歐幾里得距離和返回距離值,具體函數實現如下:

def two_point_distance(x1,y1,x2,y2 ):

dis =abs(math.sqrt((x2 -x1)*(x2 -x1)+(y2 -y1)*(y2 -y1)))

return dis

def g_count();

a=5

i=0

最后,在主循環中,使用while True 持續從攝像頭讀取視頻幀,具體函數實現如下:

while True:count=()

success,img =cap.read()

imgRGB=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)results =hands.process(imgRGB)

小車的手勢識別程序運行邏輯圖如圖2 所示。

圖2 小車手勢識別程序運行邏輯圖

3 測試驗證

將小車前端的攝像頭正對著操作者,手在攝像頭的正前方,做出“掌心向前且五指并攏向上”(見圖3a)、“掌心向后且五指并攏向下”(見圖3b)、“握拳”(見圖3c)、“右手五指并攏向左”(見圖3d)和“左手五指并攏向右”(見圖3e)的手勢,分別可以得出“后退”“前進”“停止”“右轉”和“左轉”的識別結果,通過測試,手勢識別率達到97.6%。Arduino Nano 單片機根據Python 程序計算出的手勢識別結果,執行相應手勢對應的控制命令,且將控制命令直接傳輸給小車的控制模塊,達到控制圖1 所示二軸輪式小車的對應行駛功能的目的,經過實驗,小車根據指令運動的準確率達到了97%,且小車能夠根據指令完成后退、前進、停止、右轉和左轉動作。

圖3 小車控制手勢示意圖

4 結論

本文利用Python 軟件設計了一種基于手勢識別的小車控制方法,實現了5 種手勢的小車穩定行駛控制,操作簡單方便。經過測試,此手勢識別方法的識別準確率達到97.6%,基本能實現讓小車根據指令進行運動。后續研究需進一步提高手勢識別的準確率。

猜你喜歡
右轉左轉關鍵點
交叉口借道左轉方案的交通安全仿真研究
基于車流擁擠檢測的“借道左轉”自適應智能控制*
日出(外一首)
聚焦金屬關鍵點
肉兔育肥抓好七個關鍵點
不能左轉
基于車讓人的右轉專用相位設置條件研究
道路交叉口“借道左轉”的優化控制
基于農村主路交叉路口優先右轉汽車的碰撞預警系統初步設計
醫聯體要把握三個關鍵點
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合