馬玉娟,劉曉靜
(青海大學 計算機技術與應用系,青海 西寧 810016)
唐卡歷史悠久,是中國藏族優秀傳統文化的一種繪畫藝術形式,其內容保羅萬象,包括西藏的文學藝術、藏醫藏藥等,展示了西藏地區的政治經濟和人文環境,是人們了解西藏的有效途徑,被譽為“西藏的百科全書”。近年來,體感技術得到迅速發展。微軟的Kinect體感設備能夠實時捕捉人體動作、聲音等一系列信息,因其價格低廉、實用性強等特性深受研究者們的青睞,很多國內外研究人員都選擇在此平臺上進行開發和研究。2012年,Zhang詳細介紹了Kinect傳感器及其應用效果;2015年,Péter Fankhauser等評估了Kinect v2深度傳感器在移動機器人導航中的應用。目前,林玲等建立了軌跡特征融合雙流模型對動態手勢進行識別;Feyziolu等將基于Xbox 360 Kinect的虛擬現實訓練應用到乳腺癌手術患者中,起到了比標準物理療法更好的治療效果;Assad-Uz-Zaman等開發了基于Kinect控制的NAO遠程康復機器人,成功進行遙控操作,指導和演示患者實時執行不同的手臂運動鍛煉。
經過多年的研究與開發,課題組已將Kinect體感技術應用于計算機、醫療、教育等各大領域,但在弘揚唐卡文化方面還未普及,如何以創新的思維方式將現代科技與傳統文化相結合,讓更多非藏族群眾了解這門藝術,并把唐卡文化發展為當代受歡迎的藝術形式,讓更多人感受到藏族人民的時代精神,是一個重大的研究課題。相較于體感技術在其他領域的應用發展,文中結合Kinect傳感器討論了體感交互在唐卡文化中的應用,通過手勢控制的體感交互方式實現堆繡唐卡的堆繡操作,利用Kinect采集用戶深度數據、彩色數據等,根據Kinect SDK等中間插件進行人體識別、手勢識別,利用手勢交互的方式完成堆繡操作,以掃描動態二維碼的方式保存堆繡成品到個人移動設備中。
隨著時代的發展,熱愛唐卡的人不再局限于藏傳佛教僧侶和信徒,它成為了一件藝術品,甚至工藝品,被大眾推廣,出現在了眾多博物館、展廳、商店以及藝術愛好者的手中。隨著唐卡愛好者不斷增多,其傳承方式也應隨之創新。單純的傳承和復制傳統唐卡技藝,只會讓唐卡藝術發展停滯不前。結合現代科技,繁榮唐卡文化,才能使其可持續發展。通過手勢體感交互、二維碼交互的方式了解、傳播唐卡文化,其代入感更加明確,體驗度大大增加,能夠讓用戶以放松的心態、娛樂的方式認識唐卡文化,體驗唐卡文化的博大精深,具有較好的現實意義與推廣性。
本研究以Kinect體感設備為數據輸入源,以Unity3D為開發工具,通過Kinect v2 Examples with MS-SDK中間插件來完成Kinect與Unity3D兩者間的連接。依據ZXing包生成并解析二維碼,利用UI界面截圖方式將手勢實現的堆繡作品上傳到服務器,并對返回的Json字符串進行處理,得到的圖片鏈接后賦予二維碼,通過掃描二維碼的方式保存在個人移動設備中。系統框圖如圖1所示。
系統架構主要分為四部分:手勢堆繡、UI界面、二維碼實現以及判斷是否完成堆繡。
(1)UI界面。
UI界面主要分為三部分,選擇界面、堆繡界面和二維碼面板。本項目涉及到四幅堆繡唐卡圖,可以在選擇界面選擇自己喜歡的唐卡圖進行堆繡。堆繡界面是實現堆繡功能的主界面,由四個堆繡界面組成,這四個界面除了堆繡圖以及元素不同,其他都保持一致。

圖1 系統架構
(2)手勢堆繡。
手勢堆繡需要通過Kinect SDK將Kinect傳感器與PC相連接,采集用戶數據,利用Kinect SDK平臺進行人體骨骼識別。在識別人體骨骼框架的基礎上進行手勢識別,識別到的手勢數據在PC端匹配,根據所匹配手勢動作的不同,分別實現手勢堆繡的不同操作。為了讓用戶的體驗不受設備影響,本項目在實現手勢堆繡的同時,也實現了鼠標堆繡。該文將重點介紹手勢堆繡的實現。
(3)二維碼實現。
二維碼實現分為三個步驟,待堆繡完成,首先將堆繡好的唐卡圖進行屏幕的區域性截圖,并保存在本地,然后將保存到本地的截圖上傳到服務器,再根據返回的Json字符串將圖片信息賦值給生成的二維碼,完成掃碼存圖的功能。
(4)判斷是否完成堆繡。
堆繡面板中灰色元素代表待放置元素的線框,在堆繡元素拖動過程中,通過位置判定的方式判斷是否放置正確。如果所拖動的堆繡元素放置到對應元素線框中,則該線框Bool值為True,否則為False。通過對元素框Bool值的判定以及完成按鈕是否被點擊的判定,判斷是否完成堆繡操作。判定為完成則彈出二維碼面板,否則返回界面,進行后續操作。
UI的設計與實現通過Unity3D軟件完成,利用C#腳本進行控制。堆繡UI界面中的背景、堆繡主面板、堆繡元素面板均通過添加Image或Raw Image組件并為其Texture屬性賦值實現。將堆繡元素經Photoshop黑白圖層處理,得到灰色元素線框。用Image組件將各個元素線框放置于對應原圖像所在位置,遮蓋原位的彩色圖像,實現元素線框的展示。堆繡元素面板中的每一個元素實際都是一個按鈕,在UI界面中添加十個Button物體,并在其Source Image組件中分別賦值元素圖片,即可完成元素的顯示。堆繡界面如圖2所示。

圖2 堆繡界面
選擇UI的實現方式類同于上述堆繡UI的實現方式,不同之處在于四個選擇按鈕的Image是動態的,選中狀態和未選中狀態展現不同的圖片,未選中的圖片沒有邊框,選中后的圖片用金色邊框修飾,同時用代碼控制放大選中圖片,放大倍數為1.1倍,起到突出選項的作用。選擇界面如圖3所示。

圖3 選擇界面
2.2.1 Kinect連接
本研究所使用的Kinect設備是新一代Kinect v2傳感器,與上一代Kinect v1相比,其視野更廣闊、視頻更高清、骨骼追蹤更精確,具有傳輸速度快、精確識別以及方便使用等特點,能夠滿足設計者的多種需求。傳統的彩色攝像頭對背景、光線等因素的要求較高,而Kinect v2傳感器對環境的適應能力相對較強,為開發者們研究體感互動提供了極大的便利。實現Kinect與Unity3D的連接,需要確保Kinect傳感器與電源集線器相連接,并且電源集線器要接電,之后將Kinect設備通過USB3.0連接到PC機上。在本機PC上安裝Kinect for Windows SDK v2.0,安裝好后,本機PC上會出現SDK Browser應用,打開該應用,啟動Kinect Configure Verifier項,檢測設備是否連接成功。將Kinect For Windows Wrapper中間插件導入項目,并且添加Kinect Manager以及Kinect Gestures腳本于項目中的任意一個物體,實現Kinect與Unity3D的連接以及對Kinect的控制。
2.2.2 人體數據采集
Kinect能夠采集人體的多種數據,對人體進行骨骼追蹤。其主要利用三個不同功能的攝像頭,分別進行拍攝范圍內深度數據、彩色數據的采集以及紅外檢測,采集到的人體數據如圖4所示。基于采集到的深度數據進行骨骼數據計算,追蹤到人體的25個關節,識別人體動作。對這些數據建立編程模型,在人體識別的基礎上實現手勢識別。

圖4 人體數據
2.2.3 手勢識別
手勢識別的主要依據就是提取特征參數,根據不同的特征參數對手勢進行分類。手勢識別過程如圖5所示,需要在Kinect采集用戶骨骼數據的基礎上,添加Kinect Manager等組件,Kinect Manager功能多樣,它可以實現Kinect的初始化,完成數據采集工作還可以分析處理數據,并且定位到人體骨骼位置,將骨骼數據進行輸出。由于Kinect Manager腳本已經對Kinect采集到的數據進行了處理,并將各個功能封裝成函數,在實現一些功能的時候,只需要訪問Kinect Manager組件,獲取需要的方法或屬性即可。通過對其組件的控制,提取到手部骨骼參數,生成交互數據流,識別特定手勢,實現對應操作。
編寫腳本,實現手勢控制功能,需要在腳本的Update函數里運用IsInitialized語句判斷設備是否準備好,如果準備好,即返回結果為True,再運用IsUserDetected函數判斷是否檢測到用戶。如果檢測到用戶,再運用IsJointTracked函數判斷是否追蹤到用戶右手骨骼。順利追蹤到用戶右手骨骼后,運用GetJointKinectPosition函數獲取用戶右手的世界坐標,將獲取的世界坐標通過Camera.main.WorldToScreenPoint()方法轉換為屏幕坐標,然后再將轉換好的三維屏幕坐標轉換為二維坐標。之后,將此二維坐標的位置賦予場景中設定好的手形圖標,讓手形圖標隨著用戶右手的移動而移動。因此,場景中手形圖標的運動狀態即為用戶手勢的運動狀態。

圖5 手勢識別
activeInHierarchy函數判斷元素按鈕的激活狀態、RectangleContainsScreenPoint函數判斷手形圖標位置是否在元素按鈕圖標范圍內。以上兩個條件都滿足時,可實現手勢拖動后續操作。當手勢狀態為Close(握拳)狀態,并且元素按鈕名稱為當前拖動元素名稱時,元素的父物體轉換為主面板,元素的位置時刻置為手勢圖標的位置,完成手勢獲取元素功能。手勢狀態為Open(張開)狀態時,判斷手勢圖標及拖動元素是否在當前拖動元素的線框范圍內,如果在線框范圍內,則將當前元素位置轉換為線框位置,完成放置正確元素吸附功能;如果不在線框范圍內,元素父物體轉換為本身設定好的父物體,元素位置設置為本身父物體位置,將元素歸位。元素拖動期間,倘若用戶丟失或者手勢丟失,同樣將元素歸位。手勢堆繡過程如圖6所示。

圖6 堆繡過程
通過訪問Kinect Manager腳本組件,實現Kinect與Unity3D的連接,通過腳本的編寫,得到用戶的手勢信息,從而實現手勢交互的功能。手勢識別過程關鍵代碼如下:
//第1步:判斷設備是否準備就緒。
bool IsInit=KinectManager.Instance.Is-Initialized();
//第2步:判斷是否檢測到用戶。
bool IsUser=KinectManager.Instance.I-sUserDetected();
//第3步:獲取用戶ID。
Long UserID=KinectManager.Instance.GetPrimaryUserID();
//第4步:檢測用戶右手骨骼。
bool HandRightSkel=KinectManager.
Instance.IsJointTracked(UserID,(int)KinectInt-erop.JointType.HandRight);
//第5步:獲取右手位置坐標。
Vector3 RightHandPos=KinectManage-r.Instance.GetJointKinectPosition(UserID, (int)KinectInterop.JointType.HandRight);
//第6步:檢測右手手勢,執行對應操作。
KinectInterop.HandState RightHandState=KinectManager.Instance.GetRightHandSta-te(UserID);
if(RightHandState==KinectInterop.H-andState.
Closed)
{
print(“右手握拳”);
……
}
2.3.1 屏幕截圖
場景中設置三個空物體,第一個物體位于主面板左下角,第二個物體位于主面板右下角,第三個物體位于主面板左上角。主面板的寬等于第二個物體的X坐標減去第一個物體的X坐標,主面板的高等于第三個物體的Y坐標減去第一個物體的Y坐標。創建一個RGB24位格、大小等于主面板寬高的Texture2D紋理,運用ReadPixels函數讀取屏幕指定范圍內的內容到自定義的紋理當中。執行Apply函數保存紋理,運用EncodeToPNG函數將紋理編碼為PNG格式,通過File.WriteAllBytes()函數將截圖以指定名稱保存到指定位置。
2.3.2 圖片上傳
用String字符串獲取截圖保存路徑,UnityWebRequest.Get()方法可獲取該路徑圖片的字節數組。開辟一個WWWForm類,運用AddBinaryData函數在實例化的WWWForm中添加圖片的字節數據。通過網絡請求UnityWebRequest的Post方法,將圖片上傳到服務器。上傳成功后,服務器將返回Json字符串,返回的Json字符串中包含三個鍵值對,分別為code代碼、msg提示信息和data數據。data數據對應的值為圖片上傳后的鏈接,通過Split字符串分割方法截取Json字符串中的圖片地址鏈接,保存到一個新的字符串中,以便后續二維碼展示過程中使用。
2.3.3 生成二維碼
ZXing由Java語言所實現,可以生成和解析二維碼,內容開源,能夠為其他語言提供接口,可以對各類條形碼進行圖像處理。生成二維碼需要下載ZXing中的ZXing.unity.dll插件,導入Unity3D項目中,提供生成二維碼的類庫,然后添加與二維碼相關的頭文件,引用ZXing和ZXing.QrCode命名空間。之后添加Color32類型的函數,實例化一個BarcodeWriter二維碼讀寫控件,設置二維碼格式和區域大小。生成二維碼后的效果如圖7所示。

圖7 二維碼面板
本研究的二維碼格式為QR_CODE,QR code格式的二維碼應用比較廣泛,有著極其廣泛的編碼范圍和非常大的信息存儲量。調用Encode方法對圖片進行二維碼生成,返回Color32數組,通過SetPixels32函數將返回的Color32數組設置到創建好的Texture2D紋理中。通過UI界面中添加一個Raw Image物體,并將生成的二維碼圖片紋理賦值給此物體,實現二維碼在UI界面中的展示。
為驗證本研究的可行性與有效性,文中進行了指定距離范圍內有效的拖動堆繡元素的實驗。指定距離指用戶與Kinect傳感器之間的距離,Kinect在1.5 m~2 m自身識別效果相對較好,因此實驗距離范圍設定為1.5 m~2 m。選取5名測試者,平均身高為160.6 cm。每位測試者需要在這一距離段內分別完成20次測試,并記錄對應堆繡成功次數,共測試100次,完成本次實驗,之后計算出不同距離段的平均有效率。指定距離段手勢拖動元素的有效率如表1所示。

表1 有效率
實驗測試結果顯示,文中在Unity3D中所實現的基于Kinect的唐卡圖像交互設計應用是可行的,識別率較高,平均有效率高達93%,能夠有效地實現堆繡唐卡的堆繡操作。
本研究利用微軟公司的Kinect傳感器采集人體數據,以Unity3D軟件為開發平臺搭建人機交互界面,通過Kinect SDK等中間插件實現對人體的骨骼追蹤和識別。在人體骨骼識別的基礎上進行手勢識別,再根據識別出的不同手勢進行對應的堆繡操作,并以掃描二維碼的方式保存堆繡作品,具有很好的交互性。實驗結果表明,本研究能夠有效地實現堆繡唐卡的堆繡操作,相對于傳統的唐卡文化傳播方式,本研究能夠將現代科技與傳統文化相結合,借助體感交互的趣味性,激發用戶對唐卡藝術的學習和探究欲,讓唐卡文化與時俱進,推陳出新。
該文只涉及到了唐卡文化中的堆繡文化,而且只用到了體感交互中的手勢交互。因此,不論是唐卡文化的拓展,還是體感技術的推進,都有很大的發展空間。