0 something
sdk架構示意圖:
C#中需要用的動態鏈接庫文件:
- C# interface DLL:libpxcclr.cs.dll
- C++ P/Invoke DLL:libpxccpp2c.dll
位於文件夾:$(RSSDK_DIR)/bin/x64 或 $(RSSDK_DIR)/bin/win32 中
1 概念和流
C++/C#層次體系(M表示托管Managed)。全模塊化。
PXC[M]Session
PXC[M]Session繼承自PXC[M]Base,包含I/O模塊、算法模塊和其他接口執行模塊。首先要通過靜態函數CreateInstance創建session實例,然后通過該實例創建其他模塊的實例。
public class PXCMSession : PXCMBase
{
...
public static PXCMSession CreateInstance();
public PXCMSenseManager CreateSenseManager();
...
}
PXC[M]SenseManager
PXC[M]SenseManager組織一個多模態管道(包括I/O設備和多個算法模塊),控制管道的開始、停止、暫停、繼續等等。CreateInstance創建SenseManager實例
public class PXCMSenseManager : PXCMBase
{
...
public static PXCMSenseManager CreateInstance();
...
}
在內部,PXC[M]SenseManager通過PXC[M]CaptureManager來選擇I/O設備和色彩/深度/聲音流。
初始化管道時在PXC[M]SenseManager中取得PXC[M]CaptureManager的實例,可以用來強制設備搜索,以及設置錄制和回放。然后取得PXC[M]Capture接口,可用來操作物理攝像頭,如枚舉設備/流,及查詢流配置和設備屬性。
管道運行過程中,可以通過PXC[M]Image接口,來獲取I/O設備中就緒的samples,即圖像緩存。
管道中可以包含算法模塊,如PXC[M]HandModule手部追蹤,PXC[M]FaceModule面部追蹤,利用這些模塊進行相應的設置和算法數據查詢。
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]Capture.CUID,后續PXC[M]Capture.CUID+1
- 算法通道用對應的標識符,如PXC[M]HandModule.CUID 或 PXC[M]FaceModule.CUID
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