2014-07-06 48 views
1

讀取時失蹤的Kinect幀我有OpenNI一個簡單的問題:OpenNI從「.oni」文件

如果我使用基本例如從Kinect的(或「.oni」文件),這樣的閱讀:

// Missing init 
while(true) { 
    // Read a new frame 
    rc = g_context.WaitAnyUpdateAll(); 

    g_depth.GetMetaData(g_depthMD); 

    mystuff(); 
} 
// Missing close 

如果的MyStuff()操作都假設爲100ms,將在未來幀被跳過(因爲Kinect的是30FPS所以每幀33毫秒),我會想念他們或有任何緩衝來拯救他們在Kinect或OpenNI中?比方說,我的一些JPEG保存到磁盤,我沒有得到所有圖像(時間戳:0,33,66,133,200,......)

另一個問題:

每當我保存到「.oni」文件,然後從中讀取,幀丟失,這是因爲寫入磁盤使程序跳過幀(與上述方法相同,但在方法Record()中)?當我從實時Kinect讀取所有幀時(時間戳:0,33,66,100,133,166,200,...)

+1

我可以回答你的第二個問題。 Kinect可能會獲得30 fps,但是如果你對它做了某些事情(包括保存到磁盤),那麼你會消耗時間。如果在這個時候你會得到另一個幀,並且你的程序很忙,那麼這個幀將被省略,你將得到下一個幀......所以最後你會得到20fps。我的建議是不要使用ONI,將信息保存爲圖像或PCD文件,並以您需要的速度加載它們......此外,我建議先保存在內存中,然後將其轉儲到硬盤驅動器中(如果內存足夠) – api55

+0

謝謝,那正是我需要知道的,而且沒有找到別的地方。如果您有更詳細的資料來源,請隨時分享。 在我的情況下,我必須將它保存爲.oni,因爲我需要將我的度量與我的結果關聯起來,以便任何人都可以重做它們,並且我沒有時間實施自定義方式來保存信息。 – Kriegalex

+0

我不推薦ONI。你也可以看看openni2,他們有一些東西可以選擇你想要使用的框架,儘管openni 1和2的ONI不兼容......我爲我的工作創建了一個捕獲工具,它將數據保存爲不同格式你可以使用,如果你想要https://github.com/cvlabbonn/tools_openni2 – api55

回答

0

OpenNI似乎被設計爲默認情況下,以它們被記錄的速率播放幀,基於時間戳與每個幀一起存儲。這意味着默認情況下,如果在兩次讀取幀之間完成某些處理,則可能會跳過某些幀。

如果使用OpenNI2,請將播放速度設置爲-1。這將導致所有幀被手動讀取,即每幀將逐個通過VideoStream :: readFrame()讀取,並且不會跳過或遺漏任何幀。

device.getPlaybackControl()->setSpeed(-1); 

注意OpenNI 1(1.5.7據我所知)不允許播放速度設置爲-1所以可能需要以不同的方式通過一個讀出一個幀。

+0

謝謝,但我當時堅持使用OpenNI 1,但很高興知道其他人是否需要這些信息 – Kriegalex