亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于Leap Motion體感傳感器的手部位置信息獲取方法研究

        2021-04-15 05:52:04陳國麗
        南方農(nóng)機 2021年7期
        關(guān)鍵詞:尖端手掌控件

        彭 淼 , 陳國麗 , 姜 瑜

        (重慶工業(yè)賦能創(chuàng)新中心有限公司,重慶 401123)

        0 前言

        近年來,隨著虛擬現(xiàn)實技術(shù)的迅速發(fā)展,人們愈加感受到體感交互設(shè)備所帶來的便利,如偵測手臂肌電信號Myo智能臂環(huán)、Google 眼鏡等可穿戴式交互設(shè)備[1]。Leap Motion公司推出了Leap Motion Controller小型運動控制系統(tǒng),能以200幀/秒的速度追蹤雙手,追蹤精度可達0.01mm,可用于捕捉視場范圍達150。 ,空間范圍可達8平方英尺的交互式空間中的多個物體,并且其對手勢及手部細節(jié)的識別亦是一種新的突破[2]。

        Leap Motion Controller目前的主要應(yīng)用分為兩個方面:一方面是在三維虛擬游戲方面的應(yīng)用,作為虛擬交互設(shè)備提升玩家游戲體驗;另一方面主要用于三維演示項目的虛擬設(shè)備。在演示項目的使用中有一種使用方法是用手勢代替數(shù)字來進行控制項選擇[3]。在中國,手勢早已成為人們生活中簡單方便的交流手段。而Leap Motion的手勢識別能力可達到很高的精度,因而可以將手勢作為一種設(shè)備控制的輸入方式,幫助人們完成項目選擇,如物體抓取、移動,控制小車,操作機械臂等[4]。

        本文以研究Leap Motion設(shè)備獲取手部位置信息的具體實現(xiàn)方法為目標,首先深入了解分析Leap Motion的工作原理和應(yīng)用方法,開發(fā)基于VS2017的Leap Motion手部位置獲取算法;然后編寫基于MFC的應(yīng)用程序界面,設(shè)定輸出所需位置信息的窗口,用于顯示手部位置和姿態(tài)數(shù)據(jù);最后通過實驗分析采集算法的精度以及程序的穩(wěn)定性[5-9]。針對試驗的具體結(jié)果,分析該輸出方法的優(yōu)點,并且提出一定的改進方案,為后續(xù)研究提供依據(jù)。

        1 基于Leap Motion位置信息采集

        Leap Motion作為手部信息捕獲設(shè)備,使用光學傳感器和紅外線掃描獲取處于設(shè)備上方大約150°視野范圍內(nèi)的對象。Leap Motion的有效可視范圍大約在設(shè)備上方25mm~600mm,形狀呈尖端位于設(shè)備中心的倒漏斗形[10]。圖1展示了Leap Motion如何監(jiān)視用戶的手。

        圖1 Leap Motion設(shè)備監(jiān)視用戶雙手

        1.1 獲取手部位置特征

        在了解Leap Motion控制器所使用的坐標系統(tǒng)之后,將要用到手掌的中心坐標,即如圖2所示圓點的坐標位置,然后給出中心坐標的某一具體坐標值編寫輸出方法。需要注意的是,在輸出手掌中心位置坐標時,需要判別手掌類型,即對左右手進行判斷。因此,首先輸出手掌類型。

        圖2 手掌坐標位置及方向

        在源代碼中給出了各種類以及類的相互之間的調(diào)用關(guān)系,這里僅對HandList下的C++代碼進行更改,在代碼中,程序設(shè)定了一個Controller對象,用于連接到Leap Motion后臺,從而可以通過命令Controller.frame()獲取數(shù)據(jù)。另外,程序添加了一個Listener類,來設(shè)定一些回調(diào)函數(shù)。代碼中的onFrame回調(diào)函數(shù)用于定義當獲取到一幀數(shù)據(jù)時需要處理的事件,比如通過對frame的再調(diào)用來獲取一些手部的位置數(shù)據(jù)信息,再調(diào)用的方法主要是通過語句HandList hands= frame.hands()來將幀中關(guān)于手部的數(shù)據(jù)信息傳遞給手列表中的手對象。在代碼中設(shè)定了四個float型變量,以及一個初始化為“未檢測到手”的字符變量,由于將其設(shè)定為全局變量,因此,可以在對工作狀態(tài)進行判別后,通過對變量進行賦值,來輸出手部的位置數(shù)據(jù)。

        1.2 獲取尖端坐標

        尖端對象是指在視野范圍中出現(xiàn)的對象中可以指出方向的東西,可以被表示為手指或者工具,可以通過手對象中特定的手,來獲取其相關(guān)的信息。即在獲取hand.palmPosition的同時,獲取尖端坐標,在視野中部出現(xiàn)工具的情況下,便可以通過兩者之間的物理模型關(guān)系,確定視野中手部的位置以及方向。在檢測時,程序會自動檢測手指尖端距離手掌中心最遠點的坐標并且進行輸出。與輸出手掌中心位置坐標的方式類似,程序通過onFrame回調(diào)函數(shù)獲取每一幀的數(shù)據(jù),通過命令const Pointable pointable = frame.pointables().frontmost()來獲取幀數(shù)據(jù)中所保存的尖端數(shù)據(jù)信息,并將獲取的坐標信息賦給程序開始所定義的float型變量tipx,tipy,tipz,進行輸出。

        在Leap Motion模型中,手指利用Finger類對象進行描述,是一種可指向性對象,物理特性包括Width(寬度)、Length(長度)、Direction(方向)、tipPosition(尖端坐標)以及tipVelocity(尖端速率)等。如圖3所示,圓點處的位置表示為尖端坐標,箭頭的方向表示尖端方向。

        圖3 尖端坐標及方向向量

        這里選擇尖端坐標來描述手指屬性,并基于Pointable類獲取指尖位置。與描述手掌中心坐標的方法相似,利用double型全局變量對獲取的結(jié)果進行輸出。

        1.3 手指數(shù)據(jù)信息輸出

        Leap Motion控制器可以獲取用戶十指的數(shù)據(jù)。在LeapSDK中提供了所檢測到的用戶手指物理特征數(shù)據(jù)的C++代碼,通過運行可以對相關(guān)數(shù)據(jù)進行輸出。所有的手指都包含有四根骨頭,每根骨頭可以獲取指根和指尖的坐標位置,即如圖4中小球處的坐標位置。定義的骨頭名稱如上述代碼中boneNames[]字符串所包含的四個成員。拇指模型為了便于編程的統(tǒng)一多定義了一個掌骨,長度設(shè)定為零。

        圖4 Leap Motion手指指骨模型

        1.4 識別并輸出基本手勢類型

        在Leap Motion SDK中把一些特定的運動模式定義為手勢,通過這個運動模式來對用戶的意圖進行猜測。對于每一個設(shè)備觀察到的手勢,都可以在frame.gestures列表中找到相關(guān)的數(shù)據(jù)信息。Leap Motion系統(tǒng)會將獲取到的手勢對象不斷更新在獲取的幀中。通過對手勢的判別,更多的是可以獲取到用戶手部在坐標系中的一個動作姿態(tài)特征,在檢測到用戶的一個手勢時,可以通過手部模型關(guān)聯(lián)得到用戶手部的一個大致位置。在手勢識別啟用后,便可以從幀中獲取一些數(shù)據(jù)信息。檢測手勢的代碼首先將幀中的關(guān)于手勢的數(shù)據(jù)信息傳遞給手勢類,采用了switch開關(guān)語句對手勢的基本類型進行判別,如果符合case命令下的手勢類型,則執(zhí)行該case命令并且最終結(jié)束switch循環(huán)。識別手勢基本類型的算法封裝在gesture項目中。在程序運行過程中,程序通過調(diào)用相關(guān)的函數(shù),將一些基本的信息填入進去,通過計算進行轉(zhuǎn)換,在某些數(shù)據(jù)發(fā)生了重復時,便開始判斷其是否為手勢,以及為何種類型手勢。

        2 MFC用戶程序界面搭建

        基于可視化的用戶程序界面生成系統(tǒng)是當前編程發(fā)展的方向。如瀏覽器支持界面實時刷新顯示,一些軟件運行時可以實時的更新顯示類似于時間、坐標等數(shù)值。由于在Windows中不可能完全由用戶設(shè)計這些可能需要用到的控件,因此,微軟公司推出的MFC提供了類庫,用戶可以基于此基礎(chǔ),通過重載它的各種消息處理函數(shù)來對所需要的程序界面進行編輯修改[11]。

        本文所用的VS2017是微軟公司推出的最新版集成開發(fā)工具,提供了MFC類庫[12]。MFC的框架包含有一個應(yīng)用程序所需的所有可能控件,用戶只需要對其進行使用[13]。

        2.1 設(shè)計界面生成思路

        應(yīng)用程序界面的生成包括兩個過程,首先是進行界面設(shè)計,即在編輯窗口中加入控件,并為控件添加成員變量。之后便是功能設(shè)計,用戶需要基于各成員變量,編寫功能函數(shù)來得到所需要的結(jié)果。下圖5簡單介紹了如何創(chuàng)建一個基于對話框類型的應(yīng)用程序。

        圖5 基于對話框的應(yīng)用程序工作流程圖

        2.2 Leap Motion手部位置人機交互業(yè)務(wù)流程

        在本文中所編寫的應(yīng)用程序界面需要完成的一個功能是:在Leap Motion檢測到用戶手部位置數(shù)據(jù)信息時,將存放在frame中的各結(jié)構(gòu)的三維坐標分別實時動態(tài)顯示出來,在用戶改變所需要的位置信息時輸出也會隨之發(fā)生改變[14]。因此,本文本框必要的一些控件為:手掌類型、手指個數(shù)、手掌中心、尖端、手掌角度以及基本手勢。前面四個坐標值可以表示用戶手部的基本信息以及一個大致空間位置,第五個坐標值則主要用于描述手掌的一個方向,第四個為字符串輸出,用于展示用戶手部可能組成的基本手勢。

        基于以上分析,在進行Leap Motion數(shù)據(jù)信息與MFC界面進行共享的過程中,涉及多個坐標信息,以及三個字符串類型輸出。在進行應(yīng)用程序界面設(shè)計時,為使界面信息明了,采用Group Box控件,將位置坐標輸出分別設(shè)置在不同的組合框控件中。在進行數(shù)據(jù)顯示時,控件需要有自己的一個成員變量,該變量的定義類型可能是值,或者字符串。針對本文的應(yīng)用程序,需要定義至少三個數(shù)值型成員變量以及三個字符串型成員變量[15]。

        2.3 人機交互界面編寫

        該對話框包含了手掌中心坐標、尖端坐標、手掌姿態(tài)角的數(shù)據(jù)輸出,手勢、手類型的判別,通過這些信息,可以具體地刻畫出手部在空間中的位置信息,并對其進行一定的美化,如添加圖片控件以及作者姓名信息等。完整的人機交互對話框如圖6所示。

        圖6 人機交互對話框

        在構(gòu)建好MFC應(yīng)用程序界面的對話框基本結(jié)構(gòu)之后,比較關(guān)鍵的是將Leap Motion程序與搭建的MFC框架聯(lián)系起來,獲取到數(shù)據(jù)并且進行動態(tài)顯示[16]。

        至此,添加的成員變量有:float型變量m_palmX,m_palmY,m_palmZ,用于描述手掌位置坐標;int型變量m_pitch,m_yaw,m_roll,用于描述手掌角度;CString型變量m_rightorleft,用于描述手掌類型;int型變量m_fingerscount,用于描述手指數(shù);float型變量m_tipX,m_tipY,m_tipZ,用于描述尖端位置坐標;CString型變量m_gesturetype,描述特征手勢類型。

        3 基于MFC人機交互界面的Leap Motion手部位置采集

        3.1 信息動態(tài)實時顯示

        在Leap Motion的SDK文檔中設(shè)定了一個Listener類用于監(jiān)聽設(shè)備狀態(tài)以及獲取幀數(shù)據(jù)并且將幀中的數(shù)據(jù)調(diào)用給手部各姿態(tài)用于輸出。因此,為實現(xiàn)數(shù)據(jù)傳遞,在MFC項目中新建一個名為myListener的類,用于與Leap設(shè)備建立聯(lián)系并且獲取一些數(shù)據(jù)信息。關(guān)于MFC項目對各頭文件路徑的識別,可以按照Leap Motion SDK在C++環(huán)境下的配置,在MFC項目中重新配置一次即可[17-19]。

        由于輸出信息僅需要調(diào)用onConnect函數(shù)以及onFrame函數(shù),因此,在MyListener的聲明中,僅需添加這兩個函數(shù)即可。拷貝獲取位置信息的C++代碼到myListener.cpp中,將獲取的位置數(shù)據(jù)賦給所設(shè)定的各全局變量,以方便在交互界面進行輸出[20]。在程序運行myListener.cpp后,手部位置數(shù)據(jù)信息便保存在了定義的各全局變量中。對話框的主程序代碼需要實現(xiàn)的功能是將全局變量中的數(shù)據(jù)顯示在相應(yīng)的編輯框中,并且實現(xiàn)數(shù)據(jù)的動態(tài)更新顯示。對于更新要求,采用的是添加一個onTimer函數(shù),通過定時器定時執(zhí)行某條語句,從而實現(xiàn)數(shù)據(jù)的更新顯示。

        數(shù)據(jù)通過全局變量傳遞到了每個編輯框所對應(yīng)的成員變量中,并且可以通過編寫的MFC人機交互界面進行動態(tài)顯示。實時顯示的輸出交互界面如圖7所示。

        圖7 MFC交互界面輸出結(jié)果

        對于一個信息采集設(shè)備,需要了解其所用坐標系統(tǒng),以及其可檢測范圍,之后才可以對其采集精度進行檢測。因此,需要對Leap Motion設(shè)備的可視范圍進行測定,如可采集的三維最大長度,隨后標定坐標空間的大致形狀,基于此進行Leap Motion的采集精度實驗。

        3.2 Leap motion檢測范圍試驗

        在進行測定時,首先在Leap Motion設(shè)備旁邊固定一根1m長的直尺,然后由低至高依次抬高手掌,觀察屏幕輸出的手掌中心坐標,直到輸出為0,記錄此時的手掌高度,如圖8所示。

        圖8 利用直尺測定Y方向上設(shè)備可視范圍

        測定Y正方向上,當手掌移動到距離設(shè)備上表面約1 000mm的位置時,屏幕輸出為0;最下方距離設(shè)備上表面約20mm的位置時,屏幕輸出為0??梢钥闯觯c官方給出的可視范圍基本吻合。

        之后,借助另一根直尺測定相隔一段Y方向上的距離,相應(yīng)的X與Z軸在正負方向上的極限可視范圍。測定方法與標準基本同上文相似。手掌隨直尺方向平移,觀察屏幕輸出。在輸出為0時則表示該方向到達可視范圍的邊界。如圖9所示。

        圖9 測定X與Z方向上極限可視范圍

        結(jié)果如表1所示。

        表1 三維坐標測量結(jié)果匯總表

        Leap Motion坐標系統(tǒng)的方向設(shè)定,分別作X-Y圖及Z-Y圖,如圖10所示。

        將圖10與官方給定的坐標系統(tǒng)圖示進行比較,可知系統(tǒng)的實際坐標區(qū)域可分為兩片不同類型。首先是由坐標原點到Y(jié)軸正向約620mm之間區(qū)域,大概為一個倒金字塔形。由Y軸正向距原點620mm至檢測頂點之間的區(qū)域大概是一個倒球形。

        3.3 手部姿態(tài)檢測試驗

        在交互界面上可顯示手掌姿態(tài)角數(shù)據(jù)信息,具體包括俯仰角(繞X軸)、側(cè)傾角(繞Z軸)以及橫擺角(繞Y軸)。在設(shè)備檢測到用戶手部位置信息時,界面可以實時顯示數(shù)據(jù)信息。相關(guān)手部位置及輸出信息如圖11所示。

        圖10 坐標系實際可視范圍圖

        圖11 手掌姿態(tài)角數(shù)據(jù)信息獲取

        3.4 Y軸正方向上檢測精度測定

        在設(shè)備的可視范圍測定完成后,需要沿各軸測定手掌的實際坐標值,并與程序輸出坐標值進行對比,對設(shè)備的檢測精度進行評定。本文僅對Y軸正向的檢測數(shù)據(jù)進行精度檢測。測定方式:使用一根刻度為1m、精度為1cm的直尺。在進行檢測時,首先將數(shù)據(jù)的輸出頻率降低,以方便讀數(shù)。將使用直尺測定的數(shù)據(jù)與程序輸出的坐標值進行對比,如表2所示。

        表2 沿Y軸正向測定坐標與輸出坐標數(shù)據(jù)表

        基于上表所測數(shù)據(jù),使用直尺測定值與程序輸出值數(shù)據(jù)信息,繪制兩者的數(shù)據(jù)對比線圖如圖12所示。

        圖12 手掌位置數(shù)據(jù)信息對比圖

        根據(jù)折線圖中,兩根曲線之間的擬合情況,結(jié)合數(shù)據(jù)采集過程中可能出現(xiàn)的誤差,可知在距離Leap Motion設(shè)備較近位置時,如500mm范圍內(nèi),設(shè)備的檢測精度很高,與實際測量基本無偏差;在距離設(shè)備較遠處出現(xiàn)數(shù)據(jù)的較大波動,原因可能是設(shè)備所用傳感器的靈敏度隨距離的增加逐漸降低。整體來說,其檢測精度相比較其他傳感器要更高,數(shù)據(jù)輸出更為穩(wěn)定,數(shù)據(jù)偏差范圍較小。

        另外,通過實際檢測可以得知,Leap Motion設(shè)備的實際檢測范圍可能會比官方給出的標準范圍要更大一些。在運行程序時屏幕輸出的數(shù)據(jù)精度可以達到0.000 1,精度相比以往更高。這就為用戶提供了更大的操作空間,同時其更高的檢測精度也為手部位置的獲取提供了更多的便利。

        4 總結(jié)

        關(guān)于空間物體的坐標位置獲取一直都是一個不斷發(fā)展、不斷進步的前沿研究方向,相比較以往推出的三維加速度傳感器、超聲波傳感器、溫度傳感器、雷達等檢測設(shè)備,Leap Motion具有更高的精度,可以適應(yīng)更多的使用環(huán)境。本文基于Leap公司供用戶參考學習的SDK文檔,開發(fā)設(shè)計出一種相對來說更為實用、比較簡便的手部位置信息獲取方法,并且利用VS設(shè)計出了一個簡單的MFC程序界面對數(shù)據(jù)進行輸出顯示。本文主要完成了以下工作:

        1)根據(jù)Leap公司提供的用戶參考SDK文檔,對Leap Motion獲取手部位置信息的C++程序進行了解讀并且編寫了更為直接以及簡單的輸出代碼。

        2)使用VS2017建立了一個MFC應(yīng)用程序,并且對該應(yīng)用程序的控件進行了設(shè)計,使其可以顯示所需的一些位置坐標信息。

        3)通過對其他MFC程序的參考,經(jīng)過調(diào)試將編寫的Leap Motion程序與新建的MFC程序之間建立了鏈接,使MFC控件的成員變量可以獲得不斷更新的位置數(shù)據(jù)信息并且進行動態(tài)顯示,完成了手部位置信息獲取方法的探究。

        4)本文雖然對手部位置信息獲取方法進行了探究,但是對其可能應(yīng)用的方向并沒有進行一個很好的描述,希望可以在后續(xù)工作中對該方面進行探究,并且提出一些可能應(yīng)用的場景,為其更好地與現(xiàn)實結(jié)合提供參考。

        猜你喜歡
        尖端手掌控件
        攤開手掌
        手掌上的童話
        關(guān)于.net控件數(shù)組的探討
        軟件(2018年7期)2018-08-13 09:44:42
        科學中國人(2018年8期)2018-07-23 02:26:56
        手掌上的“小洞”
        鏡頭看展
        基于位移相關(guān)法的重復壓裂裂縫尖端應(yīng)力場研究
        斷塊油氣田(2014年5期)2014-03-11 15:33:49
        加速尖端機床國產(chǎn)化
        就這樣玩會VBA中常見的自定義控件
        電腦迷(2012年24期)2012-04-29 00:44:03
        在PowerBuUder中利用WinSock控件制作簡單的Web服務(wù)器
        精品国产18久久久久久| 亚洲欧美成人中文在线网站| 久久99久久久无码国产精品色戒| av在线免费播放网站| 神马不卡影院在线播放| 男女视频在线观看一区| 亚洲国色天香卡2卡3卡4| 色老头一区二区三区| 亚洲av有码精品天堂| 国产一区二区三区四区在线视频| 刺激一区仑乱| 精品国产av最大网站| 亚洲一区二区三区在线观看播放 | 日本一区二区三区视频国产| 精品无码久久久久久国产| 中文字幕乱码人妻无码久久麻豆| 久久这里只有精品黄色| 国产精品第一二三区久久| 女人被男人躁得好爽免费视频| 日日噜噜夜夜爽爽| 国产剧情无码中文字幕在线观看不卡视频| 国产一区二区资源在线观看| 国产亚洲精品成人aa片新蒲金 | 亚洲一区二区三区麻豆 | 国产三区在线成人av| 青草热久精品视频在线观看| 国产一级r片内射视频播放| 亚洲一区二区三区内裤视 | 在线观看国产高清免费不卡黄| 国产一区二区三区4区| 亚洲精品一区二区三区新线路| 亚洲黄色天堂网站在线观看禁18 | 日韩成人精品一区二区三区| 国产精品国产三级国产an不卡| 精品乱人伦一区二区三区| 亚洲国产理论片在线播放| 国产在线视频h| 高清少妇二区三区视频在线观看| 欧美日本精品一区二区三区| 国产精品美女久久久久久久久| 亚洲色欲久久久综合网|