Kinect for Windows SDK v2.0 開發筆記 (十五) 手勢幀

來源:互聯網
上載者:User

標籤:div   lib   comment   usg   0ms   win   eth   接下來   模式   

??

(轉載請註明出處)

使用SDK: Kinect for Windows SDK v2.0 public preview1409

同前面,由於SDK未完畢,不附上函數/方法/介面的超連結。


這次最終是新的東西了。是“手勢幀”,只是原名是“可視化手勢構建器”(Visual Gesture Builder)幀,是

SDK 2.0內建的手勢解決方式。只是,假設您認為微軟寫得不可靠。甚至垃圾。您能夠嘗試自己寫個。筆者在

提供的範例中。寫了個簡單的樣子(幾十行而已,不要期望過大)。






好了,這個可視化手勢構建器(後面簡稱手勢),須要包括標頭檔
#include <Kinect.VisualGestureBuilder.h>

須要連結靜態庫
#pragma comment ( lib, "Kinect20.VisualGestureBuilder.lib" )

這部是可選的,您能夠顯式動態連結dll檔案:"Kinect20.VisualGestureBuilder.dll",也能夠

使用這個庫檔案隱式動態該檔案,還須要原SDK中某vgbtechs目錄以下的2個dll檔案。


使用VS的建置事件就可以,請注意x64還是x86.


還有就是,這個手勢資料庫是由SDK2.0內建的工具產生的*.gbd檔案。

這節不過說明怎麼使用這個檔案,至於怎麼使用工具建立檔案,應該是下節吧。誰知道呢


可能大家看過了SDK內建的“Visual Gesture Builder Viewer”了:

由於手勢幀有點簡單,我們就仿造這個做一個吧:


0. 支援隨意表單尺寸

    我們之前的範例一直是固定表單尺寸,這次能夠改變表單大小了,須要響應WM_SIZE訊息

    為了方便地改變表單,我們使用D2D 1.0中的D2D1HwndRenderTarget,由於內建了Resize方法.

1.加入表徵圖,我們使用Kinect SDK內建的表徵圖吧

    複製app.ico到project下後,在project裡面加入一個*.rc檔案,右鍵,查看代碼,不要編輯,畢竟Express版無法編輯。

    寫上

    1 ICON "app.ico"

    1代表編號    ICON代表類型     "app.ico"代表檔案名稱

   這樣編譯,程式自己主動就會加入表徵圖了。


   接下來給程式加入表徵圖:注冊表單時

   wcex.hIcon = LoadIconW(hInstance, MAKEINTRESOURCEW(1));

    那個1就是之前rc檔案填的編號。就可以

2.支援表單檔案拖拽:

    先注冊可以進行檔案拖拽: DragAcceptFiles(m_hwnd, TRUE);

     之後再響應WM_DROPFILES訊息就可以

3.新的花樣

     我們之前使用基於等待垂直同步的輪詢模式,也使用了基於訊息的事件模式.這次我們使用基於計時器的輪詢模式。

     一個SetTimer就可以,作業系統的時間片通常是20ms,所以我們就20ms的計時器吧,反正高於30FPS;

4. 渲染策略

   在左邊渲染彩色幀深度幀骨骼幀。簡直就是把最前面幾節的代碼複製過來。

   在右邊可視化手勢結果。


SDK 內建的手勢解決方案中,手勢分為兩種:

離散手勢連續手勢

enum _GestureType    {        GestureType_None= 0,        GestureType_Discrete= 1,        GestureType_Continuous= 2    } ;


簡單過程: (輕車熟路了, * 是可能須要動態改動的)


建立手勢幀源(CreateVisualGestureBuilderFrameSource)

        * 加入手勢(IVisualGestureBuilderFrameSource::AddGesture(s))

        * 刪除手勢(IVisualGestureBuilderFrameSource::RemoveGesture)

        * 更換跟蹤ID(IVisualGestureBuilderFrameSource::put_TrackingId)

開啟讀取器(IVisualGestureBuilderFrameSource::OpenReader)

輪詢擷取手勢幀:(IVisualGestureBuilderFrameReader::CalculateAndAcquireLatestFrame)

擷取對應結果
    IVisualGestureBuilderFrame::get_ContinuousGestureResult
    IVisualGestureBuilderFrame::get_DiscreteGestureResult

這兩個方法,參數均是: 第一個想要擷取結果的手勢, 第二個是相應的結果。

從這個能夠看出:

   將兩種手勢分開儲存能夠降低方法調用,可是為了方便。這裡就沒有分類;


手勢結果有:

    連續型: 進度(float)

    離散型: 結果(boolean), 信賴度(float), 是否為首幀(boolean)


那麼,問題來了!

遊戲編程哪家強?

怎麼擷取手勢呢?

CreateVisualGestureBuilderDatabaseInstanceFromFile

CreateVisualGestureBuilderDatabaseInstanceFromMemory

這兩個能夠擷取手勢資料庫了,

    MIDL_INTERFACE("7FA8E82E-E43E-4DD6-A481-1E967DC4B7C8")    IVisualGestureBuilderDatabase : public IUnknown    {    public:        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_AvailableGesturesCount(             /* [annotation][out][retval] */             _Out_  UINT *numGestures) = 0;                virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_AvailableGestures(             /* [annotation][in] */             _In_  UINT32 capacity,            /* [annotation][size_is][out] */             _Out_writes_all_(capacity)  IGesture **availableGestures) = 0;            };


筆者都不用說了吧。


至於可視化演算法,這並非重點。能夠看看代碼瞭解一下,寫得比較亂.

只是這次的代碼自己覺得還寫得不錯。建議大家細緻看看



好了,這就是成果圖了。彩色幀是黑色的,由於是關燈了。畢竟室友些睡覺了,像我這樣的人真蛋疼。


支援檔案拖拽。改變表單大小。比微軟內建的好用點。就臨時取代微軟坑爹的那個吧:

自己的電腦上關閉表單。可是進程還未退出。微軟您就慢慢坑吧


代碼:點擊這裡, 名字打錯了,打成“面形”了,請不要在意這些細節

Kinect for Windows SDK v2.0 開發筆記 (十五) 手勢幀

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.