Intel RealSense SDK 簡翻


 

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典型的使用流程:

  1. 創建實例
    PXCMSenseManager sm=PXCMSenseManager.CreateInstance();

  2. 配置組件。EnableXXX函數來激活模塊
    sm.EnableStream(PXCMCapture.StreamType.STREAM_TYPE_COLOR,0,0);

  3. 控制運行流程,獲取結果。根據線程模型,使用消息環或者事件回調傳遞數據。

     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();
     ...
     }
    
  4. 釋放實例。完整過程:

     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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM