- RealSenseTM互動開發實戰
- 王曰海 湯振宇 吳新天
- 1274字
- 2019-01-03 00:39:35
2.2 Intel RealSense SDK架構
2.2.1 SDK架構
SDK架構由多層部件組成,如圖2-4所示。最核心SDK功能為輸入/輸出(I/O)模塊和算法模塊。I/O模塊用于獲得輸入設備的信號或者輸出信息到相應設備。算法模塊包括各種模式檢測和識別算法,作為創新性人機體驗的重要手段,例如人臉識別、手勢識別、語音識別、文字轉語音等。

圖2-4 SDK架構
SDK對I/O模塊和算法模塊進行標準化,使得應用程序可以不用關心底層實現而輕松獲得所需功能。某些SDK接口可能存在共存的多重實現。SDK可以從各種算法模塊中對某個特定實現進行搜索或者創建某個算法的實例。SDK的語言與架構封裝如圖2-5所示。

圖2-5 SDK語言與框架封裝
2.2.2 會話和模塊
SDK的結構單元包括I/O模塊和算法模塊。SDK會話控制這些模塊的上下文場景,是SDK應用的主控模塊。所有SDK應用程序都會創建一個或多個SDK會話。每個會話將維護專屬的控制I/O和算法模塊的上下文場景。
在一個SDK會話內部有多個I/O和算法模塊,用來實現特定的SDK接口。在某些情況下,一個SDK接口可能會有多重實現。可以在會話中創建模塊的實例、使用或注銷模塊實例。模塊的生命周期就是模塊的工作時間。
SDK會話必須在所有模塊操作之前創建,并且在所有模塊注銷后最后注銷。
2.2.3 SenseManager中的流
SenseManager接口是所有預定義模塊的主要接口,在一個SenseManager實例中存在一個或多個算法模塊和一個單獨的攝像頭輸入設備。可以創建多個SenseManager接口實例對接不同的攝像頭。攝像頭為算法模塊提供數據。
SDK會話、SenseMangager、算法模塊、I/O模塊間的關系如圖2-6所示。

圖2-6 SDK會話、SenseMangager、算法模塊、I/O模塊間的關系圖
如圖2-7所示,應用程序安裝SenseManager接口用來讀取攝像頭原始采樣數據,并處理手勢跟蹤和面部跟蹤。

圖2-7 SenseManager接口
從概念上來說,應用程序可以把每個通道的攝像頭數據采樣和算法處理并發獨立地運行。每個通道將通過一個模塊標識符來識別獲取到的圖像采樣和算法輸出。
第一個配置采樣的圖像通道使用模塊標識符Capture.CUID,第二個使用標識符Capture.CUID+1,以此類推。
算法模塊標識符直接使用它們的接口標識符,例如HandModule.CUID或FaceModule.CUID。
典型的SenseManager接口編程流程包括以下步驟:
1)創建實例。使用CreateInstance函數創建SenseManager接口實例。
由于SenseManager接口是覆蓋很多模塊的最主要接口,SDK創建了一個函數Create-Instance來快速、方便地創建Session。可以使用CreateInstance函數來快速獲得Sense-Manager接口函數。例如:
PXCMSenseManager sm=PXCMSenseManager.CreateInstance();
2)配置組件。使用EnableXXX函數組(或者算法模塊中的Activate函數)來啟動原始采樣獲取或激活不同的算法模塊。例如:
sm.EnableStream(PXCMCapture.StreamType.STREAM_TYPE_COLOR,0,0);
3)控制執行過程及獲取結果。這依賴于應用程序的線程模型,可以選擇使用消息循環或事件回調方式來控制執行過程。無論采用哪一種方式,SenseManager都會在數據準備好時進行數據傳送(已獲取到的圖像樣本或模塊輸出)。
兩種方式的典型流程實現代碼如例2-1所示。如例2-1左邊所示,應用程序使用AcquireFrame函數等待幀數據準備好,然后使用QuerySample函數(或者訪問樣本屬性)來獲取圖像樣本,最后使用ReleaseFrame函數重新開始處理下一幀。如例2-1右邊所示,應用程序在OnNewSample函數(或者SampleArrived事件)中監聽圖像準備完畢的事件。
例2-1 控制數據流并獲取結果

在執行過程中,應用程序可以暫停或重置某一算法模塊。若對這些模塊的執行結果并不關心,暫停或重置將使得應用程序更高效、節能。
4)釋放實例。
一個簡單完整的SenseManager例子如例2-2所示。
例2-2 配置彩色數據流
PXCMSenseManager sm=PXCMSenseManager.CreateInstance();
sm.EnableStream(PXCMCapture.StreamType.STREAM_TYPE_COLOR,0,0,0);
sm.Init();
while (sm.AcquireFrame(true).isSuccessful()) {
PXCMCapture.Sample sample=sm.QuerySample();
.... // 處理圖像
sm.ReleaseFrame();
}
sm.close();
- INSTANT Mock Testing with PowerMock
- 程序員修煉之道:程序設計入門30講
- Qt 5 and OpenCV 4 Computer Vision Projects
- 深入淺出Spring Boot 2.x
- NumPy Essentials
- SQL語言從入門到精通
- Learning ArcGIS Pro
- Mastering Apache Maven 3
- Learning Python Design Patterns
- OpenStack Orchestration
- Android驅動開發權威指南
- Spring Security Essentials
- HTML并不簡單:Web前端開發精進秘籍
- Hands-On ROS for Robotics Programming
- Scala編程(第4版)