2012-03-13 38 views
1

我正在使用另一個人使用OpenNI錄製器模塊錄製的一些數據。不幸的是,他們在錄製過程中意外設置了鏡像功能,所以我遇到了一些問題:1.使用MirrorCap鏡像深度,2.使用AlternateViewPointCap將深度與rgb對齊。我嘗試從我的深度節點訪問這些功能,如下所示:可以更改播放的AlternateViewPointCap或MirrorCap

xn::Context ni_context; 
xn::Player player; 
xn::DepthGenerator g_depth; 
xn::ImageGenerator g_image; 
ni_context.Init(); 
ni_context.OpenFileRecording(oni_filename, player); 
ni_context.FindExistingNode(XN_NODE_TYPE_DEPTH, g_depth); 
ni_context.FindExistingNode(XN_NODE_TYPE_IMAGE, g_image); 
g_depth.GetMirrorCap().SetMirror(false); 
g_depth.GetAlternativeViewPointCap().SetViewPoint(g_image); 

但是,這並不奏效。即使將鏡像設置爲false,g_depth上的IsMirrored()命令仍然返回true,而alternateviewpointcap不會更改從生成器接收的深度貼圖。

我也試圖這樣做通過模擬節點:

xn::MockDepthGenerator m_depth; 
m_depth.CreateBasedOn(g_depth); 
m_depth.GetMirrorCap().SetMirror(false); 
m_depth.GetAlternativeViewPointCap().SetViewPoint(g_image); 
xn::DepthMetaData temp; 
g_depth.GetMetaData(temp); 
m_depth.SetMetaData(temp); 

這也不會影響深度圖我從m_depth得到。我很感激任何和所有的建議,如何使我的顏色和深度信息對齊,不管如何哈克。這些數據很難記錄,我需要以某種方式使用它。

我目前的解決方案是創建模擬深度節點並使用我自己的例程翻轉所有像素,然後使用SetMetaData函數進行設置。然後,我使用OpenCV創建從RGB圖像到深度圖像的透視變換,方法是讓用戶單擊4個點。然後,我將這個變換應用到rgb框架,以使值排列起來。這不是完美的,但它的工作原理 - 但是,爲了其他人可能需要使用這些數據,我想作出更適當的修復。

回答

1

不幸的是,OpenNI中的一些設計決策顯然受到Primesense SoC的影響 - 具體來說,SoC可以在硬件中進行深度 - > RGB註冊和鏡像。不幸的是,這意味着當你記錄時發電機的輸出是你的。抱歉。

從查看Primesense驅動程序中的代碼看他們如何進行註冊(XnDeviceSensorV2/Registration.cpp),看起來他們不會以可從OpenNI訪問的方式導出鏡頭參數,這是不幸的。我看到的唯一的解決方法是修改並重新編譯驅動程序以導出數據(請注意,這是用戶模式代碼,所以它不是那麼糟糕,您可能需要分叉Avin2's SensorKinect)。此外,FYI - 模擬生成器本身不做任何處理--NiRecordSynthetic示例顯示瞭如何使用模擬節點的示例。

0

添加到Roee的答案中,您可以使用OpenNI從Kinect訪問鏡頭數據,這只是有點棘手:您必須知道您正在尋找的東西的名稱和類型。例如,此代碼提取深度生成器的ZeroPlanePixelSize和ZeroPlaneDistance,稍後將其用於將投影點轉換爲真實世界點(它們隨着設備而變化)。

XnUInt64 zpd; 
XnDouble zpps; 
g_DepthGenerator.GetIntProperty("ZPD", zpd); 
g_DepthGenerator.GetRealProperty("ZPPS", zpps); 

你或許可以得到你需要通過看Avin2Sensor文件並找到這地方深度RGB視點轉換實際上是做了算法和Kinect參數。

相關問題