歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> OpenNi實戰筆記

OpenNi實戰筆記

日期:2017/2/28 15:55:24   编辑:Linux教程

OpenNI概念三層視圖

頂層:展示了基於 OpenNI 實現體感的應用程序。

中間層:展示了 OpenNI,提供傳感器和中間件組件之間交互的接口,中間件分析 傳感器數據。

底層:展示了捕捉視覺和聲音場景元素的硬件設備。

Modules 模塊

OpenNI框架是個提供了物理設備和中間件組件的一個抽象層。API能夠讓眾多組件 在OpenNI框架中注冊。這些組件被稱為模塊,被用來生成和處理感官數據。

(1) 傳感器模塊:

3D sensor 三維傳感器;

RGB camera RGB攝像頭;

IR camera 紅外攝像頭;

Audio device 音頻設備(麥克風);

(2) 中間件組件:

全肢體分析中間件:十一個處理感官數據,生成肢體相關信息(常見的數據結構如關節,方向,重心等)

手心分析中間件:是一個處理感官數據和生成手心的位置信息的軟件組件。

手勢探測中間件:是一個分辨預定義的手勢和提醒應用程序的軟件組件。

場景分析中間件:是一個分析場景圖像的軟件中間件,產生如下信息:場景的前景和背景的分離;平面圖的坐標;場景中獨特輪廓的識別。

Production Nodes 生產節點

OpenNI定義了生產節點它具有擁有能在生成體感要求的數據過程中充當生產性角 色的一套單元。 每個生產節點都能夠使用其他更低級的生產節點 (讀數據, 控制配置等) , 也能夠被其他高級節點或本應用程序使用。

生產節點類型:傳感器相關生產節點,中間件相關生產節點。

(1) 傳感器相關生產節點Sensor-related Production Nodes :

設備Device :這種節點是物理的設備(例如:深度傳感器,或者RGB攝像頭)。這個節點的主要角色是使設備可配置。

a.深度生成器Depth Generator::這種節點能夠生成深度映射。

b.圖像生成器Image Generator :這種節點能夠生成彩色圖像映射。

c.紅外生成器IR Generator :這種節點能夠生成紅外圖像映射。

e.音頻生成器Audio Generator :這種節點產生音頻流。

(2) 中間件相關生產節點Middleware Related Production Nodes:

a.手勢告警生成器Gestures Alert Generator :當特定手勢被識別能夠回調應用程序。

b.場景分析器Scene Analyzer :分析一個場景,包括前景從背景分開,識別場景中的體型,發現 平面圖。場c景分析器的主要輸出是標記的深度映射,每一個像素都包含一個標簽,指明是體型還是背景的一部分。

c.手心生成器Hand Point Generator :支持手的發現和跟蹤。這個節點當發現一個手心(手掌),或者 當手心被跟蹤時,位置發生了變化,就產生一個回調事件。

d.用戶生成器User Generator :生成一個在三維場景中的全部或部分肢體圖畫。

對於記錄目的,以下產品節點被支持:

記錄器Recorder :實現數據記錄。

播放器Player: :從記錄裡讀取數據並且播放它。

編碼器Codec :用來壓縮和解壓縮記錄中的數據

Production Chains 生產鏈

節點順序是相互依賴的,以產生所需的肢體數據,被稱為生產鏈

Capabilities 能力

一個生產節點可以被問是否支持某個能力。如果支持,這些功能就可以被特定節點調用。 OpenNI發布包括一套能力,也可以在將來繼續增加新的能力。每一個模塊能申明它 所支持的能力。此外,當需要生產鏈的列表,應用程序可以指定能力作為支持的條件。只有滿足需要能力的模塊才能被列出來。

目前支持的能力有:

(1) 替換視圖Alternative View : 讓任何類型的映射生成器(深度、 圖像、 紅外) 能夠轉換它的數據, 顯得仿佛傳感器被放到了另一個位置(被另一個生產節點顯示,通常是另外一 個傳感器)。

(2) 裁剪Cropping :讓一個映射生成器(景深、圖像、紅外)能夠輸出幀的可選區域而區別 裁剪 於整個幀。當具備裁剪能力時, 生成的映射的尺寸被減少為適合更低的分辨率。

例如, 一個映射生成器工作在VGA分辨率 (640x480) 應用程序要裁剪在300x200, 下一個像素行從300像素後開始。裁剪在性能提升方面非常有用。

(3) 幀同步Frame Sync :讓兩個傳感器產生幀數據(例如:深度、圖像)能夠同步他們的幀, 以致他們同時到達。

(4) 鏡像Mirror :讓生成器能夠生成的數據的鏡像。如果傳感器放在用戶面前,傳感器捕捉到的影像被鏡像,鏡像這時很有用,這樣右手就可以以鏡像的體型中的左手 出現了。

(5) 姿勢檢測Pose Detection :讓用戶生成器認出用戶擺出的特定姿勢。

(6) 骨骼Skeleton :讓用戶生成器能夠輸出用戶骨骼數據。這個數據包括骨骼關節的位置, 跟蹤骨骼的位置的能力,用戶校准的能力。

(7) 用戶位置User Position :讓深度生成器能夠為場景的特定區域而優化輸出特定深度映射。

(8) 錯誤狀態Error State:使一個結點在出錯的時候能報告它的狀態

(9) 鎖發現Lock Aware :讓節點能夠被上下文邊界鎖定。詳細信息,參考在應用和鎖節點間共鎖發現

生成和讀取數據

1.生成數據

產生數據的生產節點被稱為生成器。數據生成器只等到確定指令要求才實際生成數據。函數xn::Generator::StartGenerating()用來開始生成。應用程序為了保留配置,可以 通過函數xn::Generator::StopGenerating來停止數據生成,而不必釋放節點對象。

2.讀取數據

數據生成器還有個輸出鎖存功能,其在內部儲存新數據,直到收到刷新指令UpdateData ,再把最新數據傳輸上去。當然,OpenNI讓應用程序能夠等到新數據可用再刷新,指令是函數xn::Generator::WaitAndUpdateData()。

在某些情況下,應用程序操作不止一個節點,想等所有節點一起刷新。OpenNI為此

提供了幾個函數,根據在UpdateData之前什麼應該發生來區分:

xn::Context::WaitAnyUpdateAll(): 一旦任意一個節點有 新數據,那麼刷新所有節點數據。

xn::Context::WaitOneUpdateAll(): 一旦這個節點有新 數據, 那麼刷新所有節點數據。 (在當幾個節點都在生成數據但只有一個節點決定了應用程序進度時,這個函數特別有用。)

xn::Context::WaitNoneUpdateAll(): 不等待。所有節點都立即刷新。

xn::Context::WaitAndUpdateAll(): 等到所有節點都有新數據是,再刷新他們。以上四個函數都是在超時兩秒後退出。建議使用其中一個加上函數 UpdateAll(),除非你需要刷新特定節點。

在應用和鎖節點間共享設備

說白點,不同應用程序對同一設備有不同的配置,不能這個我還沒用完,你就來給我改設備的配置,這樣就亂了。

OpenNI有兩個模式讓多個應用能夠共享硬件設備:

完全共享(缺省) :在這種模式中,應用程序申明可以處理這個節點的任何配置。 OpenNI 接口讓注冊者能夠回調任何配置改變的函數,所以,當配置發生改變,應 用就被通知(被同一個應用,或者另一個使用相同硬件設備的應用) 。

鎖配置:這種模式下,應用程序聲明它要鎖定節點的當前配置。OpenNI 因此不允 許這個節點的”Set”函數被調用。如果節點是硬件設備(或任何其他可以在進程間共享的模塊) ,他應該實現” Lock Aware”能力,這樣才能跨進程邊界加鎖。

注意:當一個節點被鎖,加鎖的應用收到一個鎖句柄。不同於使用這個句柄解鎖,句柄用來在不解鎖的情況下來改變節點配置(為了不讓節點配置被其他應用“偷走”)。

Licensing 授權

模塊使用授權機制來確保它們只被授權過的應用程序使用。特定的廠商的模塊能被安裝在特定的設備上,如果使用該模塊的應用程序提供授權才能訪問該模塊。當OpenNI 在列表中查找合適的生產鏈,模塊能夠檢查授權列表。如果要求的授權沒有注冊過,模 塊能夠隱藏自己,也就是說不返回任何結果,因此也不被算到可能的生產鏈中。

The Context Object 上下文對象

上下文是指擁有適用OpenNI的應用程序的全部狀態的對象,包括應用程序使用的所有生產鏈。同一個應用可以生成多個上下文對象,但是上下文對象之間不能共享信息。上下文在使用前必須首先初始化。這個時候,所有的外掛的模塊被載入和解析。應用程序通過調用shutdown函數來釋放上下文對象的內存。

Copyright © Linux教程網 All Rights Reserved