2016-07-31 60 views
0

我正在從點雲點生成深度圖,並填寫缺少的數據,我想查看最接近的匹配顏色框。我能夠生成深度圖像(我在調用OnDepthAvailable時生成它),並且我看到TangoAR統一示例在調用OnExperimentalTangoImageAvailable時獲取顏色框架。同步深度和顏色

這是從TangoAR統一例如:

/// <summary> 
/// This will be called when a new frame is available from the camera. 
/// 
/// The first scan-line of the color image is reserved for metadata instead of image pixels. 
/// </summary> 
/// <param name="cameraId">Camera identifier.</param> 
public void OnExperimentalTangoImageAvailable(TangoEnums.TangoCameraId cameraId) 
{ 
    if (cameraId == TangoEnums.TangoCameraId.TANGO_CAMERA_COLOR) 
    { 
     m_screenUpdateTime = VideoOverlayProvider.RenderLatestFrame(TangoEnums.TangoCameraId.TANGO_CAMERA_COLOR); 

     // Rendering the latest frame changes a bunch of OpenGL state. Ensure Unity knows the current OpenGL state. 
     GL.InvalidateState(); 
    } 
} 

但是我想幀的深度幀之後,不是最新的框架可用。

如何將兩者儘可能接近地同步?看看C RBG深度同步的例子並沒有幫助我。我知道深度和顏色使用相同的攝像機,並且它不能同時進行兩次(每4個顏色幀1個深度)。

+1

您可以將圖像保存在地圖中。並使用時間戳作爲鍵和顏色圖像作爲值。然後,您可以搜索與點雲時間戳具有最短時間距離的圖像。您應該將地圖大小設置爲20個圖像以刪除過時的圖像並節省內存 – bashbug

+0

您是如何獲得SDK在Unity3D中工作的?對於我(以及約10位其他人),演示會在大約30秒後崩潰。 –

回答

2

這個問題有多種解決方案,其中之一就是bashbug建議的,緩衝幀並根據最近的時間戳來查找紋理。

我建議不需要緩衝,它是統一明確:

  1. 打開網格渲染上PointCloud,和PointCloud對象設置爲特定layer

  2. 渲染PointCloud使用着色器this doc建議,但要確保你把color mask關閉,所以點雲不渲染顏色緩衝區。

  3. 創建RenderTexture並與depth format(作爲previous doc建議)

  4. 創建具有相同的本徵(投影矩陣)的相機作爲TangoARCamera,並且僅使PointCloud的層。這臺相機將成爲我們的深度相機(相機只能渲染PointCloud)。

  5. 將深度相機設置爲無偏移量的TangoARCamera對象的子對象。這可確保相機具有與ARCamera完全相同的動作(位置和方向)。

  6. 用RGBA格式創建另一個渲染紋理,並將該紋理指定給TangoARCamera以獲取彩色圖像。

  7. 現在你有兩個紋理:深度和顏色。它們保證被同步,因爲在UnitySDK中,PointCloud預製實際上是在世界空間中的投影點,並且TangoARCamera的變換基於彩色攝像機時間戳進行更新。