sdk架構示意圖:
php
C#中須要用的動態連接庫文件:css
位於文件夾:$(RSSDK_DIR)/bin/x64 或 $(RSSDK_DIR)/bin/win32 中html
C++/C#層次體系(M表示託管Managed)。全模塊化。java
PXC[M]Session繼承自PXC[M]Base,包含I/O模塊、算法模塊和其餘接口執行模塊。首先要經過靜態函數CreateInstance建立session實例,而後經過該實例建立其餘模塊的實例。node
public class PXCMSession : PXCMBase { ... public static PXCMSession CreateInstance(); public PXCMSenseManager CreateSenseManager(); ... }
PXC[M]SenseManager組織一個多模態管道(包括I/O設備和多個算法模塊),控制管道的開始、中止、暫停、繼續等等。CreateInstance建立SenseManager實例nginx
public class PXCMSenseManager : PXCMBase { ... public static PXCMSenseManager CreateInstance(); ... }
在內部,PXC[M]SenseManager經過PXC[M]CaptureManager來選擇I/O設備和色彩/深度/聲音流。git
初始化管道時在PXC[M]SenseManager中取得PXC[M]CaptureManager的實例,能夠用來強制設備搜索,以及設置錄製和回放。而後取得PXC[M]Capture接口,可用來操做物理攝像頭,如枚舉設備/流,及查詢流配置和設備屬性。github
管道運行過程當中,能夠經過PXC[M]Image接口,來獲取I/O設備中就緒的samples,即圖像緩存。web
管道中能夠包含算法模塊,如PXC[M]HandModule手部追蹤,PXC[M]FaceModule面部追蹤,利用這些模塊進行相應的設置和算法數據查詢。ajax
PXC[M]AudioSource接口獲取聲音。特定的語音特徵直接在模塊接口中,如PXC[M]SpeechRecognition
An SDK session is the context that holds these modules. 應用程序中能夠建立一個或多個sdk sessions,每一個session維護本身單獨的I/O和算法模塊context。模塊的生命週期由session的使用決定。PXCMSession在其它模塊建立前建立,在其它模塊銷燬後銷燬。session必須是第一個建立,最後一個銷燬。
C#託管實例內部指向C++非託管實例。
PXC[M]SenseManager是這種案例的主要接口:
(1)有一個或多個算法模塊;
(2)一個攝像頭;(多個攝像頭的話能夠創建多個實例)
(3)攝像頭爲算法模塊提供數據;
理論上,應用程序能夠同時獨立地處理每一個圖像捕獲和算法運行通道,每一個通道都被賦予了一個模塊ID:
PXC[M]SenseManager典型的使用流程:
建立實例PXCMSenseManager sm=PXCMSenseManager.CreateInstance();
配置組件。EnableXXX函數來激活模塊sm.EnableStream(PXCMCapture.StreamType.STREAM_TYPE_COLOR,0,0);
控制運行流程,獲取結果。根據線程模型,使用消息環或者事件回調傳遞數據。
sm.Init(); for (;;) { pxcmStatus sts=sm.AcquireFrame(true); //AcquireFrame函數等待幀數據就緒 if (sts<pxcmStatus.PXCM_STATUS_NO_ERROR) break; PXCMCapture.Sample sample; sample=sm.QuerySample(); //QuerySample獲取圖像 .... // process image sm.ReleaseFrame(); //繼續下一幀 } sm.Close();
pxcmStatus OnNewSample(int mid, PXCMCapture.Sample sample) { // return NO ERROR to continue, // or any ERROR to exit the loop return pxcmStatus.PXCM_STATUS_NO_ERROR; } void MainRoutine(PXCMSession session) { ... // Initialize my event handler PXCMSenseManager::Handler handler= new PXCMSenseManager.Handler(); handler.onNewSample=OnNewSample; // Stream depth samples sm.Init(handler); sm.StreamFrames(true); sm.Close(); ... }
釋放實例。完整過程:
PXCMSenseManager sm=PXCMSenseManager.CreateInstance(); sm.EnableStream(PXCMCapture.StreamType.STREAM_TYPE_COLOR,0,0,0); sm.Init(); while (sm.AcquireFrame(true)>=pxcmStatus.PXCM_STATUS_NO_ERROR) { PXCMCapture.Sample sample=sm.QuerySample(); .... // process image sm.ReleaseFrame(); } sm.Dispose();
generated by haroopad