Intel RealSense SDK 簡翻

 

0 something

sdk架構示意圖:
php

C#中須要用的動態連接庫文件:css

  • C# interface DLL:libpxcclr.cs.dll
  • C++ P/Invoke DLL:libpxccpp2c.dll

位於文件夾:$(RSSDK_DIR)/bin/x64 或 $(RSSDK_DIR)/bin/win32 中html

1 概念和流

C++/C#層次體系(M表示託管Managed)。全模塊化。java

PXC[M]Session

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

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]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

相關文章
相關標籤/搜索