(湖北大學 物理與電子科學學院,武漢 430062)
具隨著計算機技術的快速發展與廣泛運用[1],小到人們日常的信息獲取、學習工作,大到企業管理、工業生產都離不開計算機[2-3]。人機交互作為人與計算機之間溝通的橋梁,成為近年來國內外的研究熱點[4]。傳統的人機交互手段大多是利用鼠標、鍵盤、觸摸屏等接觸式設備[5],但人類為了使人機交互變得更加自然與方便,開始探索著新的人機交互手段來提高交互效率。于是涌現出了一大批諸如基于可穿戴設備,智能語音,視覺感知(Visual Perception)等新的人機交互方案[6-8]。利用視覺感知的人機交互方案的優勢在于:①符合人們日常生活的交流習慣,交互效率高;②不需要人體與機器之間進行直接接觸[9]。當前視覺感知技術主要依賴的是對于人體肢體動作的準確識別。常見的肢體動作識別方法有整體全局識別和局部特征識別,但識別時都需要非常龐大的計算量,導致識別實現難度大,不適用于視覺感知的人機交互場合。
參考人體骨架模型,本文設計了一種基于人體構造的姿態識別算法,并應用此算法在FPGA平臺上實現了一套視覺感知的機器人控制系統,可快速準確地識別人體動作,并控制機器人實時跟隨人體運動。
人體的簡化骨架構造模型如圖1所示,這一骨架模型決定了人的骨架是依靠關節所連接,而人體的關節可以視作一種n元樹的模型,每一個關節結點均是一個有一定自由度的旋轉點。

圖1 人體的簡化骨架構造模型
人體運動具體可以細分為兩類[10]:基礎動作和獨立運動。基礎動作是人體運動的最基礎部分,如“伸手”、“抬腿”等;獨立運動是指一個完整的人體活動,是由不同的基礎動作結合而成,如“慢走”,“跑步”等。因此識別人體姿態的關鍵在于識別出人體的基礎動作,通過對關節位置變化的分析可推斷出與其相連接骨骼的運動,從而知曉正在進行的基礎動作,因此分析關節運動是分析人體基礎動作的核心,人體一個完整的獨立運動可看作人體每個關節協調運動的結果。如果得到了關節的位置以及關節的轉動角這些關鍵參數,就可以正確地識別出人體正在進行的動作。基于以上原理,通過引入相對坐標系分析人體中各個關節的位置,然后利用空間向量的方法求解出各個關節的轉動角,進而可以識別出人體當前的肢體動作。
人體姿態識別的基礎是對得到的人體畫面進行分析處理,而對其進行一定的預處理,消除圖像中的噪聲、保留原始圖像中的整體信息,可以大大提高整個圖像處理過程的效率,增加識別的準確率[11-12]。本設計對人體畫面圖像進行預處理分為兩步,第一步是對圖像進行降噪,第二步是剔除冗余圖像幀。
2.1.1 圖像降噪
攝像頭采集得到的圖像信號,由于攝像頭自身成像系統、介質和設備等的缺陷以及外界環境的復雜性,不可避免地摻有各種類型的噪聲,從而降低了圖像信號的質量,影響后續圖像處理過程的效果、效率以及準確性[13],因而系統對采集得到的圖像降噪是不可避免的。
本設計利用快速排序法實現中值濾波對圖像進行降噪。中值濾波是對圖像在時域上進行平滑化處理,從而去除噪點和異常數據[14],處理過程如圖2所示。使用一個3*3像素矩陣窗口對整個圖像進行掃描,在掃描的過程中,對每個像素矩陣內的R、G、B值分別進行排序,得到各自的中值,再用中值代替每個窗口中心像素原來的R、G、B值。

圖2 像素矩陣處理過程
實現中值濾波的傳統排序方法,需對像素矩陣中的所有值按照大小順序進行一一排序后才能取出中值[15],這樣的排序過程需要6級比較電路來實現,而且處理過程中存在很多冗余,導致排序效率不高。本設計通過改進傳統方法,實現快速排序,可僅靠3級比較電路進行流水線操作取出3*3像素矩陣的中值,實現流程如圖3所示。

圖3 快速排序法的實現流程
2.1.2 剔除冗余幀
對于攝像頭捕獲到的畫面,真正要處理的是人體產生運動的圖像幀。但在實際的人機交互場合中,可能某一個時間段內人體并沒有發生肢體運動的改變,那么這個時間段內攝像頭拍攝的畫面對于人體姿態識別并沒有幫助。如果對這些冗余幀進行處理,反而會浪費系統資源,降低系統工作效率。本設計采用的是圖像幀相差的方法來判斷圖像幀是否冗余,設一段時間內拍攝到的人體畫面共有N幀,P是拍攝到的圖像幀,x為圖像幀的序號,對相鄰兩幀圖像進行相差得:
Y(x)=|P(x)-P(x-1)|
(1)
然后對相差得到的結果Y(x)設置一個閾值范圍,如果其未超出這個范圍即認定該圖像P(x)是冗余圖像幀并舍棄,如果其超出閾值范圍則認定該圖像幀P(x)為有效幀進而進行處理。
圖像預處理完成后,為進一步判斷人體的肢體動作,需要確定畫面中人體關節所處的位置。假定畫面中的人身著長衣長褲,則可通過人體皮膚檢測的方法定位出人的頭部和手部的位置。但對于人的手肘,膝蓋,腳踝這些關節,因為有衣服的遮擋,無法被識別出來,需要利用顏色標記的方法來協助識別,即用顏色標記物標記這些被遮擋的關節部位。
2.2.1 人體皮膚檢測
現有的很多人體皮膚檢測方法都是基于軟件的設計思想,檢測時需將被檢測的畫面與特征庫進行匹配,需要大的存儲空間和對數據庫的大量訪問[16],用硬件實現起來會非常復雜,并不適合在FPGA平臺上實現。本設計利用FPGA優秀的并行處理能力,采用顏色空間可逆分量轉換(Reversible Color Transform)的方法實現對人體皮膚的檢測。RGB和YUV顏色空間的可逆分量轉換滿足如下方程式:
(2)
近些年來的研究發現,人類膚色都傾向于在一定狹窄的色度值范圍內[17],即Ur,Vr分量在一定范圍之內。若想更大限度地去除可能屬于背景區域的像素,這個色度值的范圍需要設置的足夠窄,然而如果指定的色度范圍過窄,可能會錯誤把實際上屬于人類皮膚區域的像素當做背景區域忽略。本設計的顏色傳輸是以30bits RGB格式進行,經實際測試一個合適的檢測人體皮膚的色度值范圍為:
0≤Vr
(3)
30≤Ur≤300
(4)
在確定了人體皮膚所處的位置后,需要把相應皮膚位置在相對坐標系中的坐標確定下來。而人體皮膚在圖像中是一塊區域,需要確定這一塊人體皮膚區域所在位置的中心坐標,此時需要利用求質心的方法來確定此塊區域中心坐標。實現的方法即是將圖像中的該區域皮膚像素點所在的X,Y坐標進行累加,并對像素點的個數進行計數,然后讓累加的X,Y坐標值除以總的像素點個數,即公式(5)、(6)。基于以上方法實際人體皮膚檢測的測試效果如圖4所示。

(5)

(6)

圖4 人體皮膚檢測測試效果圖
圖像中白色部分為人體皮膚所在部位,黑色為被過濾掉的無關背景,三個小方塊分別標記著皮膚所在的位置。
2.2.2 顏色標記檢測
為了實現對特定顏色標記物的識別,本設計通過多次檢測顏色標記物在圖像中的RGB值分布,得到其所處的大概RGB值范圍。假定人的手肘被純紅色物體所標記,在簡單背景的環境下,以30bits RGB格式為例,對純紅色標記物設定的RGB范圍為R>800,G<100,B<100。處于該限定范圍內的所有像素點所構成的區域,即為純紅色物體所在的區域,也就是圖像中人體的手肘所在處。
由于人體構造的特殊性,人體的左手肘始終存在于右手肘的左側,人體的右手肘始終存在于左手肘的右側,所以可以通過判斷標記物的相對位置對左右手肘進行區分,利用顏色標記識別人體左右手肘的測試效果如圖5所示。對于人的左右膝蓋和腳踝則可以利用不同顏色的標記物的方法來協助進行識別。得到關節所處的區域范圍后,接著利用公式(5)、(6)分別來確定這些關節的中心坐標。

圖5 顏色標記檢測測試效果圖
系統在得到了人體各個關節在相對坐標系的坐標后,為識別出人體的肢體動作,需要結合人體各個關節的位置識別出每個關節的轉動角。最普遍的計算角度的方法是依靠平面幾何,但采用平面幾何的方法會給計算機進行計算時帶來很多邊界條件,導致編程過程很繁雜,而且容易出錯[18]。利用空間向量算法計算角度相較于平面幾何法,只用考慮公式本身,沒有邊界條件的約束,大大簡化了計算的過程。
故本設計采用空間向量法來計算每個關節的轉動角。以識別人體手臂肢體運動為例,計算關節的轉動角,設某一時刻人體左臂在相對坐標系的位置如圖6、7所示。正面攝像頭將人體畫面投影到相對坐標系中的xOy平面,側面攝像頭將人體畫面投影到相對坐標系中的yOz平面。結合兩個攝像頭的畫面可以將人體關節在實際空間中的位置確定下來,得到人體肩膀、手肘和手掌在實際空間中所處的位置為A,B,C三點。

圖6 正面攝像頭拍攝到的人體左臂畫面

圖7 側面攝像頭拍攝到的人體左臂畫面
其中向量AB代表人的大臂的位置,向量BC代表人的小臂的位置。由于人體肩膀的位置相對于人臉部的位置是固定的,因此只要確定了人臉部的位置,肩膀的位置也隨之確定。人體肩膀、手肘和手掌投影到xOy平面中的位置為A1、B1、C1,由此可以確定其的x,y坐標,同理由其投影到yOz平面中A2、B2、C2的位置,可確定其的y,z坐標,結合兩平面的數據可以得到,人體肩膀、手肘和手掌在相對坐標系中的坐標。
人手臂整體運動的關鍵在于人肩膀和手肘關節轉動所帶動的肢體運動,其中人肩膀關節的轉動所帶來的肢體運動可以分解為大臂的上下抬起和大臂的前后運動,而手肘關節的轉動所帶來的肢體運動可以簡單的認為只有小臂的上下抬起,其轉動示意圖如圖8所示。因此可以把一個完整的手臂運動分解成多個轉動的組合,而每一個單獨的轉動均可利用空間向量法來求其轉動角。分析攝像頭得到的人體關節在相對坐標系中的坐標可得左手小臂抬起的角度為∠ABC、左手大臂抬起的角度為∠H1A1B1、左手大臂前后揮動的角度為∠H2A2B2,其中人的大臂往人的身體前方還是后方揮動可通過比較Cz和Az來判斷。

圖8 手臂轉動示意圖
具體轉動角度值為:
(7)
(8)
(9)
基于以上人體姿態識別算法,本設計在FPGA平臺上實現了一套簡單高效的視覺感知人機交互系統,控制機器人實時跟隨人體運動。
整個系統由FPGA控制板、機器人、攝像頭、VGA顯示器以及藍牙通信模塊組成,系統框圖如圖9所示,FPGA控制板作為整套系統的核心,利用其強大的計算能力滿足系統對于實時性的要求,同時為提高整個系統的運行效率和靈活性,本設計采用軟硬協同的設計思想,在FPGA上搭載了以NIOS II為軟核的嵌入式處理器。

圖9 系統框圖
如同人眼從外界獲取信息需要進行分析處理后大腦才能感知畫面[19],FPGA端的圖像采集模塊在接收到攝像頭捕獲的人體畫面后并不能直接運用,需要先對采集到的人體影像進行解碼,其解碼流程為:將從攝像頭得到的信號進行譯碼處理得到ITU-R 656編碼的圖像數據,隨后將圖像數據的亮度與彩度信號分開,轉換為YUV4:2:2編碼的圖像,再經由解交錯與縮放處理,得到YCbCr編碼的畫面,最后對畫面的亮度與彩度信號進行轉化得到可用于VGA顯示的RGB888編碼的圖像。另一方面為了識別出人體的肢體動作,FPGA端對解碼后的圖像進行識別得到了人體關節在相對坐標系中的位置,并根據得到的位置信息利用空間向量法計算每個關節的轉動角。在利用空間向量法計算轉動角的過程中需要利用大量的反三角函數,若只靠FPGA硬件端實現會消耗大量查找表,設計靈活性差。如果把計算反三角函數的過程放在Nios II軟核中處理,利用Nios II軟核靈活性高的優勢,會極大提高整個系統的工作效率。本設計是在Quartus 17.1的開發環境下實現對Nios II軟核的開發,其開發流程如圖10所示。

圖10 Nios II開發流程
本設計在FPGA端和機器人端均擴展了一個藍牙模塊,使FPGA端可以遠程控制機器人。通訊時采用的是Bluetooth Specification V4.0 藍牙協議,該藍牙協議通訊時對收發字節長度沒有限制,而且擁有比傳統藍牙協議更遠的通信距離[20]。同時為了保證通訊時整套系統運行更加高效,需要將識別到的肢體動作編碼成舵機的控制指令集后再傳輸。
如同人體行動可以看做是所有關節協調運動的結果,機器人的運動也可看成是所有舵機同時轉動的結果。本設計所使用的機器人控制核心為多路舵機控制板,控制板通過同時控制17個舵機的轉動實現一個完整的機器人運動,機器人舵機模型如圖11所示。

圖11 機器人舵機模型
如何有效控制舵機的轉動是機器人在接收到人體肢體動作的信號后實時跟隨人體運動的關鍵,其中舵機轉動的角度取決于多路舵機控制板控制一個周期為20 ms的PWM信號波里高電平持續的時間。以機器人執行一個完整舉起左手的動作為例,假定機器人保持站立時所有的舵機停留在0°,首先需要控制6號舵機停留在180°以保證機器人的左大臂外翻,然后控制7號舵機停留在90°使機器人的左大臂抬起,最后讓8號舵機停留在90°讓機器人的左小臂也抬起。
最終實現的整套基于視覺感知的人機交互系統實物如圖12所示。系統的工作流程為:給所有的硬件系統接上電源,人體進入攝像頭的識別區域,FPGA控制板從攝像頭捕獲人體的運動,然后將此動作編碼,經藍牙傳輸給機器人的多路舵機控制板。控制板根據收到的編碼,調用相應控制模塊,同時控制17路舵機,使機器人完成相應動作,實時跟隨人體運動。

圖12 系統實物圖
實際測試時,讓測試者做出不同姿態,觀察系統是否能準確識別肢體動作以及機器人能否正確跟隨人體運動。實際測試效果如圖13所示,對于人體的一些基礎的肢體動作,如站立、舉手、走路等,系統都能快速準確識別,機器人也能平穩地跟隨人體運動。

圖13 實際測試效果
鑒于光照環境的不同對于圖像處理過程的重大影響,為驗證系統工作的穩定性,我們分別在白天光照充足的室內和晚上燈照良好的室內兩種環境下,識別人體肢體動作100次,所得測試結果如表1。

表1 兩種光照條件下人體姿態識別測試結果
可以看出,不同光照條件下,系統的識別成功率均保持在95%以上,平均滯后時間也被控制在0.5 s以內,系統工作穩定,且識別的準確性和實時性均能滿足設計要求。
本文改進現有算法,設計了一套基于人體構造的姿態識別算法,并基于這種算法在FPGA平臺上實現了一套視覺人機交互系統,能實時控制機器人跟隨人體運動。系統充分利用FPGA強大的運算能力,采用流水線技術高效率地實現了對圖像的預處理和人體皮膚及關節處顏色標記的檢測,同時調用NIOS II軟核處理器,使用空間向量法計算關節轉動角。實際測試驗證了該方法的可行性和高效率,未來該設計可廣泛應用于人與服務機器人之間的視覺感知交互,使機器人能夠更好更快的理解人類動作,并根據人類的行為從事一般的服務工作。