OpenNI 大改版,OpenNI 2.0 推出!


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 / Kinect 相關文章目錄

對「OpenNI 大改版,OpenNI 2.0 推出!」的想法

  1. 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 控制器上?
      如果接在同一個控制器上,可能會有一些問題。

  2. Heresy 你好
    不好意思我是初學者
    看了OpenNi 1.x 與 OpenNi 2 的架構圖之後
    有點有看沒有懂
    可以舉些簡單的例子, 使用middleware的流程差異嗎?

  3. 你好

    請問是不是無法讓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 系列,這類型的官方支援的硬體,基本上就不會有問題。

  4. 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 了。 ^^"

發表留言

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料