同步深度和颜色

问题描述 投票:0回答:1

我正在从点云点生成深度图,并填写我想要查看最接近的匹配颜色框的缺失数据。我能够生成深度图像(我在调用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个深度)。

unity3d unity5 google-project-tango
1个回答
2
投票

这个问题有多种解决方案,其中之一就是bashbug建议,缓冲帧并根据最接近的时间戳查找纹理。

我建议的不需要缓冲,它是Unity特定的:

  1. 打开PointCloud上的网格渲染,并将PointCloud对象设置为特定的layer
  2. 渲染PointCloud使用this doc中建议的着色器,但请确保关闭color mask,因此点云不会渲染到颜色缓冲区。
  3. 创建一个RenderTexturedepth format(作为previous doc建议)
  4. 使用与TangoARCamera相同的内在(投影矩阵)创建相机,并仅渲染PointCloud的图层。这台相机将是我们的深度相机(相机只渲染PointCloud)。
  5. 将深度相机设置为TangoARCamera对象的子对象,没有偏移。这可确保相机具有与ARCamera完全相同的运动(位置和方向)。
  6. 使用RGBA格式创建另一个渲染纹理,并将此纹理指定给TangoARCamera以获取彩色图像。
  7. 现在你有两种纹理:深度和颜色。它们保证同步,因为在UnitySDK中,PointCloud预制实际上在世界空间中投射点,并且TangoARCamera`的变换基于彩色摄像机时间戳更新。
© www.soinside.com 2019 - 2024. All rights reserved.