【計算機視覺】深度相機(九)--OpenNI API及中間件說明

本文由官方文檔翻譯而來php

 

總覽

目的

OpenNI 2.0 API(應用程序編程接口)提供了訪問PrimerSense的兼容深度傳感器。這就使得一個應用程序可以初始化傳感器和從設備接收深度(depth),彩圖(RGB)和紅外(IR)視頻流,還提供了一個統一的接口給傳感器和經過深度傳感器建立.oni記錄文件。css

OpenNI也提供了第三方中間件開發者能夠相互使用深度傳感器的統一接口。應用程序還能用第三方中間件(如NITE2),也可使用直接由OpenNI提供的基礎的深度和視頻數據。html

高級API一覽

獲取深度視頻流須要使用4個主要的類(class)。mysql

1.     openni::OpenNI提供了一個靜態的API進入點。它提供訪問設備,設備相關事件,版本和錯誤信息。固然,首先得確保你鏈接了設備。linux

2.     openni::Device提供了一個傳感器設備鏈接系統的接口(我的理解就是經過Device類來訪問控制傳感器)。在它建立以前須要對OpenNI類進行初始化。Device能夠訪問流(Streams)。程序員

3.     openni::VideoStream從一個設備(Device)裏提取一個視頻流,須要獲取視頻幀引用(VideoFrameRefs)。redis

4.     openni::VideoFramRef從相關的源數據裏提取一個視頻幀。這是從一個特定的流裏面獲取的。算法

 

除了這些主要的類之外,還有許多類和結構體用來保持一些特殊類型的數據。Rocorder類就是用來存儲OpenNI視頻流到文件的。還有Listener類用來監聽OpenNI和Stream類產生的事件。sql

視頻流能夠經過兩種方式來獲取數據:輪詢和事件。下面會有具體介紹。數據庫

OpenNI 類

簡介

首先是最主要組成OpenNI2的是openni::OpenNI,這個類提供了一個API的靜態入口。可用來訪問系統中全部的設備(傳感器設備)。也能夠生成許多設備鏈接和斷開事件,和提供以輪詢方式訪問數據流的功能同樣。

 

設備的基礎訪問

OpenNI類提供了API的靜態入口,是在OpenNI::initialize()方法。這個方法初始化全部的傳感器驅動而且掃描系統中全部可用的傳感器設備。全部使用OpenNI的應用程序在使用其餘API以前都應該調用此方法。

一旦初始化方法完成,將可能會設備(Device)對象,並使用這些對象來和真實的傳感器硬件進行交互。OpenNI::enumerateDevices()方法會返回一個已經鏈接上系統的可用的傳感器設備列表。

當應用程序準備退出時,必須調用OpenNI::shutdown()方法來關閉全部驅動而且正確地清除全部。

 

視頻流(Video Streams)的基礎訪問

流的輪詢訪問系統是OpenNI::waitForStream()方法實現的。此方法的參數之一就是流的列表。當方法調用時,就會鎖定直到列表中的流有新的可用數據。而後返回一個狀態碼(status code)並指向是哪一個流有可用數據了。

 

設備的事件驅動訪問

OpenNI類提供了一個在事件驅動方式(event driven manner)中訪問設備的框架。OpenNI定義了3個事件:設備鏈接事件(onDeviceConnected),設備斷開事件(onDeviceDisconnected),設備狀態改變事件(onDeviceStateChanged)。設備鏈接事件是在一個新的設備鏈接並經過OpenNI可用時產生的,設備斷開事件是在一個設備從系統中移除時產生的。設備狀態改變事件是在設備的設置被改變時產生的。

 

能夠用下列方法從事件處理列表中增添或者移除監聽器類(Listener classes):

OpenNI::addDeviceConnectedListener()//添加設備鏈接事件監聽器

OpenNI::addDeviceDisconnectedListener()//添加設備斷開事件監聽器

OpenNI::addDeviceStateChangedListener()//添加設備狀態改變事件監聽器

OpenNI::removeDeviceConnectedListener()//移除設備鏈接事件監聽器

OpenNI::removeDeviceDisconnectedListener()//移除設備斷開事件監聽器

OpenNI::removeDeviceStateChangedListener()//移除設備狀態改變事件監聽器

 

3個事件都提供了一個指針指向OpenNI::DeviceInfo對象。這個對象用來獲取被事件提交的設備的細節和標識。此外,設備狀態改變事件還提供了一個指針指向DeviceState對象,這個對象被用來查看設備新的狀態信息。

 

事件驅動經過視頻流類(VideoStream class)來訪問真實的視頻流

 

錯誤信息

在SDK中有許多方法都會返回一個類型爲「Status」的值。當錯誤發生,Status就會包含有一個記錄或者顯示給用戶的代碼。OpenNI::getExtendedError()方法會返回更多的關於錯誤的可讀信息。

 

版本信息

API的版本信息由OpenNI::getVersion()方法來獲取。這個方法返回應用程序目前使用的API的版本信息。

 

 

 

設備類(Device Class)

簡介

openni::Device類提供了一個物理硬件設備的接口(經過驅動)。也經過一個從物理設備得來的ONI記錄文件提供了一個模擬硬件設備的接口。

設備的基本目的是提供流。設備對象被用來鏈接和配置底層文件或者硬件設備,並從設備中建立流。

注意:這裏設備對象是和一整個設備(好比一臺kinect或者一臺xtion)聯繫的,而不是具體到某個傳感器。

設備聯繫的前置條件(這裏的設備聯繫指的是代碼裏鏈接設備獲取流,物理上的鏈接必須在此以前)

在設備類能鏈接到物理硬件設備前,設備必須在物理上正確地鏈接到主機,而且驅動必須安裝完畢。OpenNI2自帶PrimeSense傳感器驅動。

若是鏈接的是ONI文件,那要求在系統運行應用程序時ONI記錄文件必須可用,並且應用程序有足夠的權限去訪問。

固然,也須要在聯繫設備前openni::OpenNI::initialize()方法被調用。這將會初始化驅動,使API知道設備鏈接了。

基本操做

構造函數

設備類(Device class)的構造函數沒有參數,也不會聯繫到物理硬件設備。只是簡單地建立對象。

Device::open()

此方法用來聯繫到物理硬件設備。open()方法有一個參數,設備的URI(統一資源標識符),方法返回一個狀態碼指示是否成功。

最簡單的用法是用常量openni::ANY_DEVICE做爲設備的URI,用這個常量會使系統鏈接全部的硬件設備。當剛好只有一個設備已鏈接,這招就會很是有用。

若是多個傳感器鏈接了,那就得先調用OpenNI::enumerateDevices()來獲取可用的設備列表。而後找到你要找的設備,經過調用DeviceInfo::getUri()來獲取URI,用此方法的輸出做爲Device::open()的參數,而後就能打開對應的設備了。

若是打開文件,那參數就是ONI文件的路徑。

Device::close()

close()方法用來關閉硬件設備。按照慣例,全部打開的設備必需要關閉。這會分離硬件設備和驅動,這樣後面的應用程序鏈接它們就不會有什麼麻煩了。

 

Device::isValid()

isValid()方法用來肯定設備是否正確地和設備對象聯繫到了

 

從一個設備中獲取信息

能夠獲取關於設備的基礎信息。信息包括名稱,供應商,uri,USB VID/PID(usb的id有兩部分,供應商id即VID,產品id即PID)。openni::DeviceInfo類就提供了相關信息。每一個可用信息都有getter方法,從給定的設備對象裏獲取DeviceInfo就調用Device::getDeviceInfo()方法

 

一個設備可能由許多傳感器組成。好比一個PrimeSense設備就由IR(紅外)傳感器,一個color(顏色)傳感器和一個depth(深度)傳感器組成。流的打開必須基於已經有的傳感器。也就是說有什麼傳感器你才能打開什麼流

 

能夠從一個設備中獲得傳感器列表。Device::hasSensor()方法用來查詢設備是否有特定的傳感器。傳感器類型以下:

 

SENSOR_IR – The IR video sensor 紅外視頻傳感器
SENSOR_COLOR – The RGB-Color video sensor 彩色視頻傳感器
SENSOR_DEPTH – The depth video sensor 深度視頻傳感器

 

若是要找的傳感器可用,Device::getSensorInfo()方法就能夠用來獲取其信息。SensorInfo提供了傳感器類型,包含了視頻模式的數組的getter方法。個別視頻模式被封裝進了VideoMode類。

 

特殊設備功能

配準(Registration,我我的更喜歡OpenNI1的叫法,視圖替換)

一些設備會同時產生深度流和彩圖流。一般這些流由不一樣的物理攝像頭來生成。然而它們在實際上的位置是不一樣,就形成了它們生成的同一畫面是從不一樣角度得來的。這就使得從同一設備對象不一樣的流獲得的圖像有所不一樣。

 

兩個攝像頭之間的幾何關係和距離對於設備對象來講都是已知的。這就能夠經過數學上的變換來使得兩幅圖像可以一致。讓一個疊加在另外一個上。好比彩圖的每一個像素疊加到深度圖上。這個過程就是配準(每個像素配準疊加到另外一張圖上)

 

一些設備可以在硬件進行運算,那麼能夠校準數據。若是這個功能可用,那硬件上有個標示flag來進行開或關。

 

設備對象提供了isImageRegistrationSupported()方法來測試已鏈接的設備是否支持配準功能。若是支持,那getImageRegistrationMode()能用來查詢這個功能的狀態,setImageRegistrationMode()就能夠設置它。openni::ImageRegistrationMode枚舉提供瞭如下值用來set或get:

 

IMAGE_REGISTRATION_OFF – Hardware registration features aredisabled 硬件配準功能被禁用
IMAGE_REGISTRATION_DEPTH_TO_IMAGE – The depth image is transformed tohave the same apparent vantage point as the RGB image 深度圖像被變換疊加至彩圖上

 

須要注意的是兩個傳感器的可視範圍有部分不重疊。這就致使部分深度圖不會在顯示在結果中。在深度圖有毛邊的地方的能夠看到「影子」或者「孔洞」,因爲距離攝像頭距離的不一樣而看起來不一樣數量的物體被「轉移變形(shifted)」了。致使遠的物體移動大過近的物體。而它們之間留下了一個沒有可用的深度信息的空間。(這一段我也有點迷糊了...)

 

幀同步(FramSync)

當深度和彩圖流均可用,那可能兩個流會出現不一樣步,會致使輕微的幀率不一樣,或者是幀到達時間的輕微不一樣,即便是幀率相同時。

一些設備提供了使兩個幀同步的功能,爲了在肯定的最大時間範圍內分別從獲取到兩個幀,一般這個最大值都小於兩幀間隔。這個功能就是幀同步。

啓用或禁用此功能用setDepthColorSyncEnable()。

 

通用功能(General Capabilities)

一些設備有功能設置不一樣於幀同步和配準。OpenNI 2.0提供了setProperty()和getProperty()方法來激活這些功能。setProperty方法用一個屬性Id和值來設置它。getProperty方法則返回對應Id的屬性的值。

 

查閱傳感器供應商對於特殊附加屬性的支持,及對應數字id和屬性的值。

 

文件設備(File Devices)

總覽

OpenNI 2.0 提供了記錄設備輸出到文件的功能(記錄文件是ONI文件,一般擴展名爲.oni)。能夠選擇記錄設備裏的全部的流,在錄像時保證設置都爲使能。一旦錄像開始,那麼錄像就能夠做爲「文件設備」打開。

 

打開文件設備和打開設備差很少,都是調用Device::open(),只不過文件設備是用文件路徑做爲URI。

 

這個功能在運行調試時很是有用。實時場景很難甚至不能再現,而經過錄像功能,就使得同一輸入可以用於多個算法,調試,性能比較。此功能能用於應用的自動化測試,或者是在一個項目中攝像頭不足,測試代碼就能夠用記錄文件來替代。最後,錄像還可使得技術支持經過查看用戶攝像頭的輸出文件找出問題實現遠程支持。

 

重放控制類(PlaybackControl class)用於訪問文件設備的特殊功能。查看關於此類的章節獲取更多信息。爲了促進寫出通用目的的處理文件和設備的代碼,OpenNI提供了Device::isFile()方法,容許應用在嘗試使用重放控制以前肯定是文件仍是設備。

 

重放控制類(PlaybackControl Class)

簡介

在處理記錄文件(recorded file)時可能會有一系列操做。這些操做包括在流裏查找,肯定記錄有多長,循環播放,改變重放速度。這個功能封裝在PlaybackControl類中。

初始化(Initializing)

在使用PlaybackControl類以前,必須實例化和從文件初始化一個Device類。一旦一個可用的文件設備被建立,你就能夠經過調用Device::getPlaybackControl()得到其中的PlaybackControl對象。Device::IsFile()方法被用來肯定一個Device是否從一個文件建立的。

查找定位(seek)

提供了兩個方法從一個記錄中查找定位

PlaybackControl::seek()方法用一個視頻流指針(VideoStream pointer)和幀ID(frameID)做爲輸入,而後重放到指定的幀。若是一個記錄中有多個流,那全部的流都會被設置到一樣的位置上(定位的位置是指定流指定幀ID的位置)。

PlaybackControl::getNumberOfFrames()方法用來肯定這個記錄有多長。從根本上肯定可用目標來查找頗有用。此方法以一個流的指針做爲輸入,返回指定流所包含的幀的數目。須要注意的是同一記錄的不一樣流可能不一樣的幀總數。由於真不會一直都同步。

重放速度(Playback Speed

此功能在測試一個有很大輸入數據集合的算法時頗有效。由於能夠更快地獲得結果。

PlaybackControl::setSpeed()方法使用一個浮點數做爲輸入。這個輸入值做用於記錄製做的多種速度。好比記錄是一個30fps的流,而後輸入值爲2.0,那麼重放速度爲60fps,若是輸入值爲0.5,那重放速度爲15fps。

設置速度爲0.0會致使流播放速度爲極限速度(系統能運行的最大速度)。設置速度爲-1會致使流變成手動讀取,即播放會暫停,卡在這一幀,直到應用程序去去讀取下一幀。將記錄置爲手動模式(manual mode),讀取將會很緊密地循環,這就和設置速度爲0.0很像。設置速度0.0是由於在用事件驅動模式進行數據讀取時頗有用。

PlaybackControl::getSpeed()方法會返回最近設置的速度值。

 

循環播放(Playback Looping)

一個物理傳感器會繼續產生數據沒法肯定,而記錄又只有必定數量的幀。這時用一個記錄來模擬一個物理傳感器就會有問題,應用程序的代碼設計是用來處理物理傳感器,所以不能拿來處理記錄的結束。

爲了解決這個問題,API提供了一個循環播放的方法。PlaybackControl::setRepeatEnabled()方法用來開關循環。設置值爲true則重複讀取,讀完最後一幀又讀第一幀。若是設置值爲false,那麼在記錄讀取完後致使沒有數據幀了。

PlaybackControl::getRepeatEnable()可用來獲取當前的重複(repeat)值。

 

視頻流類(VideoStream Class)

簡介

由設備類建立的視頻流類封裝了全部的數據流。這就使得你能夠對數據流進行開始,中止,和配置。也被用來進行流一級(和設備一級相對)的參數配置。

視頻流的基礎功能

建立和初始化視頻流

調用視頻流默認的構造函數會建立一個空的未初始化的視頻流對象。在使用前,這個對象必須調用VideoStream::create()進行初始化。而create()方法要求一個已經初始化的設備對象。一旦建立,你就能夠調用VideoStream::start()方法來產生數據流。VideoStream::stop()方法則會中止產生數據流。

基於輪詢的數據讀取

一旦視頻流建立完畢,就能夠直接經過VideoStream::readFrame()方法進行讀取數據。若是有新的可用數據了,這個方法就會返回一個能夠訪問由視頻流生成的最新的視頻幀引用(VideoFrameRef)。若是沒有新的幀可用,那就會鎖定直到有新的幀可用。

須要注意的是,若是非循環地從記錄中讀取,那麼在追後一幀讀取完畢後程序將永遠卡死在此方法

 

基於事件的數據讀取

在事件驅動方式下(event driven manner)從視頻流中讀取數據是能夠的。首先,須要建立一個類繼承自VideoStream::Listener類,此類應該實現方法onNewFrame()。一旦你建立了這個類,實例化了它,就能夠經過VideoStream::addListener()方法來添加監聽器。當有新的幀到達,自定義的監聽器類的onNewFrame()方法就被調用。而後你就能夠調用readFrame()讀取了。

 

獲取關於視頻流的信息

傳感器信息(SensorInfo)和視頻模式(VideoMode)

傳感器信息和視頻模式類能夠一直追蹤視頻流的信息。視頻模式封裝了視頻流的幀率(frame rate),分辨率(resolution)和像素格式(pixel format)。傳感器信息包含了產生視頻流的傳感器的類型和每一個流的視頻模式對象列表。經過遍歷這個列表,那就能肯定傳感器生成的流的全部可能的模式。

使用VideoStream::getSensorInfo可以獲得當前流的傳感器信息對象

視野(Field of View

此功能爲肯定建立了視頻流的傳感器的視野範圍。使用getHorizonFieldOfView()和getVerticalFieldOfView()方法來肯定視野。其返回的值是弧度。

像素最大最小值(Min and Max PixelValues)

在深度流中,一般知道一個像素可能出現的最大值和最小值是頗有用的。用getMinPixelValue()和getMaxPixleValue()方法就能獲取這些信息。

配置視頻流

視頻模式(Video Mode)

能夠設置給定流的幀率(frame rate),分辨率(resolution)和像素格式(pixel type)。設置這些就要用到setVideoMode()方法。在此以前,你首先須要獲取已配置視頻流的傳感器信息(SensorInfo),而後你才能選擇一個可用的視頻模式。

裁剪(Cropping)

若是傳感器支持裁剪,視頻流會提供方法來控制它。使用VideoStream::isCroppingSupported()方法來肯定是否支持。

若是支持,使用setCropping()來使能裁剪和設置裁剪的具體配置。ResetCropping()方法被用來再次關閉裁剪。getCropping()方法用來獲取當前的裁剪設置。

鏡像(Mirroring) 

鏡像,顧名思義,就是使視頻流所展示的看起來就像在鏡子裏同樣。啓用或禁用鏡像,使用VideoStream::setMirroringEnable()方法。設置true爲啓用,設置false爲禁用。可用getMirroringEnable()來獲取當前設置。

通用屬性(General Properties)

在固件層,大多數的傳感器設置都存儲爲地址/值的隊(address/value pairs,就是一種鍵值對)。因此能夠經過setProperty和getProperty方法直接操做。這些方法被sdk內部用來實現裁剪,鏡像,等等。而它們一般不會被應用程序頻繁地使用,由於大多數有用的屬性都被更加友好的方法封裝了。

 

視頻幀引用類(VideoFrameRef Class)

簡介

視頻幀引用類封裝了從視頻流讀取的單個幀的全部的相關數據。是視頻流用來返回每個新的幀。它提供了訪問包含了幀數據(元數據,工做所需的幀)基礎數組。

視頻幀引用對象是從VideoStream::readFrame()方法獲取的。

視頻幀引用數據能夠從紅外攝像頭,RGB攝像頭或者深度攝像頭獲取。getSensorType()方法用來肯定產生此幀的傳感器類型。它會返回傳感器類型,一個枚舉值。

訪問幀數據

VideoFrameRef::getDate()方法返回一個直接指向幀數據的指針。類型爲void,這樣每一個像素的數據類型才能正確地索引。

元數據(metadata)

每一個幀都會提供一系列的元數據來促進數據自己的工做。

數據裁剪(Cropping data)

數據幀引用知道視頻流的裁剪設置,所以能夠用來肯定裁剪框的原點,裁剪框的大小和幀是否啓用裁剪功能。實現方法以下:getCropOriginX(),getCropOriginY(),getCroppingEnable().若啓用裁剪功能,則裁剪框大小等於幀大小。因此肯定這些的方法和肯定幀分辨率的方法是同樣同樣兒的(東北話)。

時間戳(TimeStamp)

每幀數據都有個時間戳。這個值是基於任意0值開始的微妙數。是不一樣於兩幀之間時間差。同一設備的全部流用的都是同一0值,因此時間戳的差值能夠用來比較不一樣流的幀。

OpenNI 2.0中,時間戳的0值是第一幀數據的到達時間。然而這沒法保證每次都同樣,因此程序代碼應該使用時間戳增量。時間戳的值自己不該該用做一種絕對的時間指向。

幀索引(FrameIndex)

除了時間戳,幀還提供了連續的幀索引號。這在肯定已知的兩幀之間有多少幀頗有用。若是流使用了同步方法Device::setColorDepthSync(),那相應的幀的幀號應該就是一致的。

若是沒有同步,那幀號將不必定匹配。這種狀況下,用時間戳來肯定相關幀的位置更有效。

視頻模式(Video Modes)

VideoFrameRef::getVideoMode()用來肯定生成當前幀的傳感器的視頻模式。信息包括像素格式,分辨率,幀率。

數據大小(Data Size)

getDataSize()用來肯定圖像數組中全部數據的大小。在分配存儲幀的緩衝區時或者肯定幀數時頗有用。須要注意的是這是整個數組的數據大小。用VideoMode::getPixelFormat()來肯定每一個數組元素的大小。

圖像分辨率(Image Resolution)

getHeight()和getWidth()方法來肯定幀的分辨率很容易。這個數據數據也能夠經過VideoFrameRef::getVideoMode().getResolutionX()和VideoFrameRef::getVideoMode().getResolutionY()來獲取,但不適合頻繁調用,由於過低效了。

數據有效性(Data Validity)

VideoFrameRef::isValid()方法肯定當前視頻幀引用是不是有效數據。

在視頻幀引用初始化結構體和第一次數據加載之間調用會返回false。

傳感器類型(Sensor Type)

肯定產生數據幀的傳感器類型用getSensorType()。方法返回傳感器類型,爲如下的枚舉值:

SENSOR_IR– for an image taken with an IR camera 紅外傳感器
SENSOR_COLOR – for an image taken with an RGB camera 
彩圖傳感器
SENSOR_DEPTH – for an image taken with a depth sensor 
深度傳感器

數組跨度(Array Stride)

包含幀的數組跨度能夠用getStrideBytes()來獲取。它將返回數組每行數據的大小,單位字節byte。主要用於索引二維圖像數據。

記錄器類(Recorder Class)

簡介

記錄器類用來記錄視頻數據到ONI文件中。ONI文件是OpenNI記錄深度傳感器輸出的標準記錄文件。包含了一到多個流的信息(如從一個PrimeSense傳感器中同時記錄一個深度和彩圖流)。還包含了設備的設置信息。因此能夠用來經過文件實例化設備對象。

設置記錄器

設置一個記錄器有三大步。

一,調用默認構造函數構造一個記錄器對象。這不一樣於其餘類的實例化。

二,調用Recorder::creat()方法,參數爲記錄文件的文件名。建立和寫入文件出錯時返回一個錯誤碼。

三,提供一個數據流進行記錄。使用Recorder::attach()方法來聯繫上給定的視頻流。若是你記錄多個流,那就屢次調用來聯繫每一個視頻流,也就是逐個添加(很明顯是寫API的人偷懶了)。

記錄

視頻流聯繫上後,調用Recorder::start()方法開始記錄。方法一調用,每幀數據都會被寫入ONI文件。經過調用Recorder::stop()方法來結束記錄。調用Recorder::destroy()方法來讓文件存盤,釋放全部內存。

重放

ONI能夠被許多OpenNI程序和公用程序進行重放。程序打開ONI文件都是做爲文件設備打開的。重放控制封裝在重放控制類裏(Playback Class)。

支撐類(SupportClasses

簡介

除了OpenNI的主要類外,還有一系列的支撐類。這些類主要服務於封裝數據,在其餘主要類的章節都有所說起。

傳感器配置類

設備信息(DeviceInfo)

此類記錄了設備的全部配置,包括設備名,URI,USB VID/PID描述符和供應商。

傳感器信息(SensorInfo)

此類存儲了傳感器的全部配置,這裏的傳感器僅是三大傳感器之一的一個。一個設備有多個傳感器。

視頻模式(VideoMode)

此類存儲了分辨率,幀率和像素格式。用於視頻流的設置和查看設置,由視頻幀引用查看這些設置,由傳感器信息提供一個視頻模式的列表。

攝像頭設置(CameraSetting)

存儲了RGB攝像頭的設置,能夠啓用或禁用自動白平衡和自動曝光。

數據存儲類/結構體

版本

軟件版本。由OpenNI發佈。一些應用程序須要適配相應版本的時候使用。

RGB888Pixel

結構體,存儲彩色像素值。

數組(Array)

OpenNI提供的簡單數組類。包含圖像數據。

座標轉換(Coordinate Conversion)

座標轉換類用來進行真實座標和深度座標的轉換。詳情請參考API。


補充:

基於OpenNI開發的Middleware介紹  

原文 :http://blog.csdn.net/yangtrees/article/details/8707603

OpenNI是一個簡單高效的Kinect開發的開源框架,它有着簡單易用的特色,很多大學和研究機構都選擇它做爲開發平臺,而不選擇功能強大的Kinect SDK,在這裏給你們介紹幾款基於OpenNI開發的Middleware:

1.      NITE2:

提供完整的手勢控制與身體控制API,手勢定位和跟蹤;人體骨架跟蹤……

優勢:佔用CPU少,簡單靈活,多平臺支持(Windows、Linux、Mac OS and Andorid)


       url:http://www.primesense.com/solutions/nite-middleware/

 

2.      3D Hand Tracking Library

提供完整的3D手勢跟蹤框架的API

優勢:無需任何標記跟蹤3D手勢的位置、方向、關節。

缺點:平臺要求較高,

Presequisites:Windows7 64bit or Ubuntu 12.04 64bit workstation. NVidia GPU withCUDA  support.


url:http://cvrlcode.ics.forth.gr/handtracking/

 

3.      SigmaNIL Framework

提供很是強大的天然用戶交互藉口,包括:包括手勢重建(能達到手指精度)、手勢識別、手勢骨架跟蹤。

優勢:徹底開源,框架完整

Presequisites: OpenNI與NITE或KinectSDK,一些module與sample須要Boost、OpenCV、CUDA Toolkit,sample須要Qt。


url:http://www.sigmanil.com

 

4.      TipTep Skeletonizer

根據手勢的深度圖提供手勢的幾何骨架。

Presequisites:Windowsx86/x64, .NET 4.


url:http://tiptep.com/index.php/products

 

5.      3D Face Identification

原理:1.利用OpenCV的人臉檢測在RGB圖像中定位人臉;2.將人臉區域的深度數據轉化爲提早規範好的深度數據;3.將探測出的數據與數據庫中的數據進行比對。

優勢:The program提供探測和識別的基本函數集能夠供二次開發。Real-time。

Reference:[1] R. Min, J. Choi, G. Medioni, J.-L. Dugelay, 「 Real-Time 3D FaceIdentification from a Depth Camera」, 21st International Conference on PatternRecognition (ICPR), November 11-15, 2012.

Presequisites:支持GPU編程的顯卡。


url: http://iris.usc.edu/USC-Computer-Vision.html

 

6.      Volumental

Volumental是一種最快捷和簡便的方式,他能將掃描和分享任何你想到的對象包括:人、對象或房間。Volumental爲你的瀏覽器提供一個插件來鏈接你的深度攝像機,使用專門的硬件和算法在雲端重建3D模型。

Presequisites:Windows平臺. Verified to work with Safari, Firefox and Chrome


url:http://www.volumental.com/

 

7.      KScan3D Middleware

KScan3D提供完整的3D掃描數據的提取和處理方案,包含一個魯棒性好的API和LUA-based自動化腳本。集成的腳本編輯器提供了一個基於gui控制檯日誌記錄輸出和調試腳本的語法方式。還能夠經過API dll爲你的項目提供來自KScan3D的功能,包括:掃描、對齊、網格處理

Presequisites:Windows 7 or8(64-bit recommended)


url: http://www.kscan3d.com/

 KScan3D與SDK 1.7的Kinect Fusion的功能比較接近,可是隻能無償使用14天。


8.      VIIM SDK V2.0.0 Beta

在OpenNI與NITE的基礎上簡化功能,增長高層特徵。VIIM SDK的目標是爲每位程序員提供更通用的NUI,它實際上就是加強版的OpenNI/NITE.

Presequisites:Windows 7 orlater ; x64/x86;


url: http://www.viim.pt/

 

9.      GST API

GST(GlobalSensing Technologies)提供的很是簡單的程序識別項目,GSTSkeletonPostures可以很是流暢的標記用戶動做。

Presequisites:Windows 7 32or 64 bits, the last corresponding version of OpenNI2 and NiTE2 librariesinstalled. Project have been made using Microsoft SDK 7.1 and Microsoft visualC++ express 2010.


url:http://globalsensing.eu/

 

10.  Motion Nexus Plugin

Motion Nexus Plugin經過OpenNI爲Flash開發者提供工具和環境來創建真實的浸入式和交互式遊戲與應用。


url:http://www.motionnexus.com/openni.html

 

11.  Starry Night Feature ExtractionDemonstration SDK

特徵提取SDK容許用戶簡單地提供(1)所需的感興趣對象的模型,和(2)一種包含該對象的場景的三維掃描。該軟件識別和定位對象在三維掃描的場景。凡高的星夜證實了這個SDK的特徵提取能力,只是實時的三維物體識別和分析軟件所提供的許多功能之一。

Presequisites:PC running Windows 7 with OpenNI 2.0 installed, Carmine sensor


url:http://www.vangoghimaging.com/3d     _scanning_imaging_products.html



這些程序其實開源程度不同,你們能夠移步:http://www.openni.org/作深刻了解~

相關文章
相關標籤/搜索