2016-07-31 63 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的变换基于彩色摄像机时间戳进行更新。