OpenNI 這個深度感應器的開發框架,在今年五月更新到 1.5.4.0 unstable 之後,就一直沒有動作了;相較於微軟 Kinect for Windows SDK 的進化,說實話,還真的讓人滿擔心他的後續發展的。
而現在,OpenNI 終於有大動作了!他不但推出了新的 OpenNI 2.0(Beta 中),在整個程式介面上做了相當大的改變,更把官方網站(http://www.openni.org/)做了大幅度的調整、並把官方論壇由 Google Group(連結)搬到自己的環境(連結)了~
根據官方的說法,OpenNI 2.0 主要的改進包括了(參考):
- 支援新一代 3D 感應器(短距離版等、應該還包括之前介紹過的 PS1200、Capri 1.25)
- 提供了大量的第三方(third party)Middleware 函式庫,包括了身體追蹤(Body Tracking)、3D 重建(3D Reconstruction)、物體辨識(Object Recognition)、分析(Analytics)等功能
- 允許事件導向(event-driven)的程式開發
- 更好的向下相容性(backwards compatibility)
- 每一個程式都有 OpenNI 和 middleware 函式庫的獨立副本
(原文:Private copy of OpenNI and Middleware Libraries for each application) - 更好的多感應器支援,middleware 函式庫現在提供個別的 API
而在 release note(連結)裡,則也有提到一些新的變化,包括了:
- 支援將深度像素轉換到彩色影像的座標系統
- 在 PS1080 裝置上,可以把彩色感應器的自動曝光和自動白平衡關閉
- 新的發布模式:現在每一個程式可以有各自獨立的 OpenNI 2.0 runtime binary 副本
(以前應該是強制一台電腦都用同一份) - 在 Windows 下可以透過 Kinect for Windows SDK 支援 Microsoft Kinect 感應器
新的下載頁面現在是:http://www.openni.org/openni-sdk/,目前有提供 2.0.0.29 的 Windows 和 Linux 的 beta 版,Mac OS X 的版本則還沒有出來;根據 release note(連結)的資訊,目前支援的作業系統包括了 Windows XP SP2 以後的 Windows,以及 Ubuntu 12.04+,32/64 位元都可以使用。而開發環境目前則是可以使用 Microsoft Visual Studio 2008 and 2010 和 GCC 4.x。
在左邊也可以切換到其他的下載項目,除了 OpwnNI SDK 本身外,還包括了「Middleware Libraries」、「Tools & Wrappers」、「Applications」 三大類;包含 PrimeSense NiTE 2 在內,目前也算是有不少內容了~某方面來說,以後開發體感程式的彈性應該會更大了。
但是相對的,其實在 OpenNI 2.0 裡,他是把本來 OpenNI 1.x 的 plug-in 架構,徹底捨棄了;以後使用者必須個別去控制各個不同 middleware,來完成自己想做的工作。
下圖是 OpenNI 1 的架構圖:
可以看到,OpenNI SDK 在 1.x 的時候,除了去處理和硬體的溝通外,也把應用程式和 middleware 的溝通做了一層轉換,讓介面統一化;所以在這個框架下,開發者可以只學習 OpenNI 的介面,就來完成程式的開發,而不需要去管 middleware 是怎麼實作、要怎麼控制,因為這部分都被 OpenNI SDK 做掉了。
而下圖則是 OpenNI 2 的架構圖:
在 OpenNI 2 的架構裡,OpenNI 不再去管 middleware 怎麼玩了~他只專心去處理硬體、以及來自應用程式的控制;而 middleware 除了會透過 OpenNI 的 API 來讀取硬體產生的資料外,就像一個獨立的函式庫一樣,程式開發者需要自己去控制他,來做到自己想做的事。
這樣的好處是 OpenNI 本身變得更加地單純(2.0 的 Windows 版 SDK 大小剩不到 8MB),而 middleware 的開發也會更簡單、更彈性,不再受限於 OpenNI 框架的功能限制。但是相對的,應用程式的開發者就需要針對不同的 middleware,去學習他們各自的用法了…所以這個改變到底是好是壞?其實 Heresy 個人是覺得滿難認定的。
除此之外,OpenNI 2.0 應該也把 framework 和硬體的溝通,由 server – client 的方式,改成直接去存取硬體了。
至於要怎麼開始進行開發呢?針對舊版的 OpenNI 開發者,OpenNI 有提供一份《OpenNI Migration Guide》,來告訴使用者要怎麼把舊有、OpenNI 1.x 的程式開發架構,轉移到 2.0 上。而針對新的開發者,OpenNI 除了提供新的《OpenNI Programmer’s Guide》外,也還有提供《Get Started》等資源,可以做開發上的參考。
而以《OpenNI Migration Guide》裡的說法,OpenNI 2.0 主要的架構改變,包括了:
- New OpenNI Design Philosophy
- Simplified Middleware Interface
- Simplified Data Types
- Transition from Data Centric to Device Centric
- Easier to Learn and Understand
- Event Driven Depth Access
Heresy 自己還沒真得下去測試 OpenNI 2.0 的程式開發,以範例程式來看,最顯著的變化,應該就是 header 和 namespace 都從 xn 正名為 openni 了~而由於架構差異非常大,所以舊的程式如果要修改成使用 OpenNI 2.0 的話,基本上要修改的幅度會非常大…不過,以目前的測試看來,OpenNI 1.x 和 OpenNI 2.0 應該是可以並存、同時安裝的,所以短時間內,應該可以同時使用這兩者,慢慢來做移植了~
接下來…Heresy 應該會開始針對新版 OpenNI 和 NiTE 來相關的教學文件。而至於其他的 middleware 呢,Heresy 應該也會在選幾個有興趣的來研究,如果覺得夠好玩的話,應該也會寫一些介紹或教學吧~ :)
[…] 而在去年年底,OpenNI 推出 2.0 版後,Heresy 除了開始研究、並寫部落格文章外,一樣也有在進行教材的規劃。而目前雖然還沒有舉辦過公開的課程,不過實際上教材已經算是準備到一個段落、並有在兩所大學的課程使用了。 […]
讚讚
Heresys您好!!
我目前使用的系統如下:
OS: Window 7 專業版(64-bit)
Devie: Xtion Pro (PS1080) * 2
SDK: OpenNI2 2.1.0.4 for Windows 64-bit
Driver: PrimeSense (psdrv3) PrimeSense (11/21/2011 3.1.3.1)
想要請教的問題為:是否在OpenNI2上能夠支援多個PS1080裝置的連接?
由 OpenNI 2.1.02 的release note指出,該次改版處理了:當嘗試開啟超8個PS1080裝置時會有Crach的狀況(PS1080 Bug Fix: trying to open more than 8 devices will crash),因此由以上的資訊研判OpenNI 2應該有支援多台PS1080裝置的連接,但我實際上用程式去執行時,對於第二台PS1080 裝置會產生以下的錯誤訊息:
XnOniDevice: Can’t initialize stream of type 2: Failed to set USB interface!
Stream: couldn’t create using source 2
Context: Couldn’t create stream from device:1d0017a0, source: 2
個人在猜想:
1. 是否與驅動程式(psdrv3)有關,因許久未更新,但我在網路上找很久也沒有找到更新的
2. 不同的裝置(PS1080)是否不能夠安裝在同一個USB controler上(目前還沒嘗試)
不知在此方面Heresys您是否有遇到過相似的問題?
以上,問題有點冗長,感謝您撥冗看完,謝謝!!
讚讚
可以支援多個裝置,至少 Heresy 自己曾經接過兩台 Xtion Pro Live 加一台 Kinect 同時使用,沒有問題。(NiTE 還是不行就是了)
驅動程式的部分,安裝 OpenNI 2 後,在 C:\Program Files\OpenNI2\Driver 就可以找到驅動程式了。
個人是建議,麻煩確認一下感應器是否有接在不同的 USB 控制器上?
如果接在同一個控制器上,可能會有一些問題。
讚讚
[…] Kinect for Windows SDK 有很多優點,不過基本上 Heresy 自己是只有在玩 OpenNI 而已,所以對於 Kinect for Windows SDK […]
讚讚
Heresy 你好
不好意思我是初學者
看了OpenNi 1.x 與 OpenNi 2 的架構圖之後
有點有看沒有懂
可以舉些簡單的例子, 使用middleware的流程差異嗎?
讚讚
middleware library 的使用基本上已經沒有固定流程了,使用方法會根據使用的 middleware library 來決定。
以 NiTE2 來說,可以參考: https://kheresy.wordpress.com/2013/01/07/basic-usage-of-nite2/
讚讚
你好
請問是不是無法讓NI及NI2同時存在電腦並且可以個別執行呢?
雖然NI跟NI2還有NITE1及2可以同時存在電腦裡,我也有裝微軟SDK v1.6。
一開始先試NI2的NIviewer運作OK。但改開NI的NIViewer就會找不到裝置
除非我去系統管理員將安裝SDK 1.6驅動所建立的kinect裝置驅動砍掉,讓他自己重抓一次。
這樣卻變成NI2的NIviewer找不到裝置。
這樣是正常的嗎?
讚讚
這是正常的。
如果是 Kinect 的硬體的話,因為 OpenNI 1.x 所需要的驅動程式是特殊版本的驅動程式,所以無法和 Kinect for Windows SDK 與 OpenNI 2 所用的驅動程式同時使用。
如果是使用 ASUS Xtion 系列,這類型的官方支援的硬體,基本上就不會有問題。
讚讚
[…] 在去年年底,終於推出了全新架構的 OpenNI 2。在 OpenNI 2 的架構下,捨棄了比較複雜的 plug-in 架構的 middleware,讓 OpenNI […]
讚讚
OpenNI 2.0.0.32 Unstable版推出!支援 Mac OS X
http://www.openni.org/openni-sdk/
讚讚
[…] ← OpenNI 大改版,OpenNI 2.0 推出! […]
讚讚
那關於primesence是否有對應還是直接使用最新版即可?
讚讚
你是指 PrimeSense 的 NiTE 嗎?
由於 OpenNI 2.x 的架構和 OpenNI 1.x 完全不同,所以舊版都是無法使用的。
你需要到 OpenNI 官網,下載 NiTE 2
http://www.openni.org/files/nite/
讚讚
是否之前的avin2 SensorKinect for Microsoft Kinect
(https://github.com/avin2/SensorKinect/tree/unstable/Bin)
不再支援OpenNI 2.0了?
我安裝了OpenNI 2.0 SDK, 然後開啟NiViewer, Command Prompt 出現
“openDevice failed: DeviceOpen using default: no devices found"
但是我在Device Manager可看到Microsoft Kinect
(是avin2 SensorKinect 抓到Micorsoft Kinect的)
讚讚
OpenNI 2.0 不需要 avin2 SensorKinect Driver了
根據官方回應以及我自己的測試
http://community.openni.org/openni/topics/why_kinect_is_not_working_with_openni2_0
先安裝 KinectSDK-v1.6-Setup.exe,
再安裝 OpenNI 2.0即可
讚讚
言下之意 Microsoft Kinect SDK以及openNI不會衝突了?
讚讚
是的。在 OpenNI 2 的架構下,Kinect 是使用微軟的驅動程式,所以不會和 Kinect for Windows SDK 衝突。
讚讚
是的。OpenNI 2.0 現在是直接透過 Microsoft Kinect for Windows SDK 去支援 Microsoft Kinect 感應器。
所以如果要在 Windows 下使用 Kinect 感應器的話,是需要安裝 Kinect for Windows SDK 的。
讚讚
Heresy 您好,
您之前寫過一篇"修改深度資訊讓UserGenerator使用"
在這次改版,我在Nite好像沒有看到任何界面是可以讓Nite讀取自行修改的深度資訊
請問您有看到相關問題嘛!?
讚讚
Heresy 也還在研究中。
不過目前看來,OpenNI 2.0 的功能算是被減到最低的程度了,之前用來修改深度圖的 Mock Node,應該是確定沒了。
所以之後要讓 NiTE 2 可以使用修改過的深度影像,可能要看看還有沒有其他介面可以介入了。
讚讚
目前在NITE沒找到任何介面可以介入的 冏
希望等下次改版會出現,
不過下次改版不知要等到啥實了~~冏
讚讚
以目前的界面來看,比較有希望的可能是自己寫出一個符合 OpenNI 2.0 架構的 mock device…
但是以 OpenNI 1.x 的經驗來看,NiTE 應該會做很多檢查…
讚讚
恩…看來 OpenNI 2 的 Device 還沒辦法這個簡單去繼承來用…
要做到這件事,現階段看來還是得改 source 了。 ^^"
讚讚