標籤: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 開發筆記 (十五) 手勢幀