同步深度和颜色

Sync depth and color

我正在从点云点生成深度图,为了填充缺失的数据,我想查看最接近的匹配色框。我能够生成深度图像(我在调用 OnDepthAvailable 时生成它),并且我看到 TangoAR unity 示例在调用 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 个深度)。

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

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

  1. PointCloud 上打开网格渲染,并将 PointCloud 对象设置为特定的 layer

  2. Render PointCloud 使用 this doc, but make sure you turn the color mask 关闭时建议的着色器,因此点云不会渲染到颜色缓冲区。

  3. 创建 RenderTexture 并使用 depth format (as the previous doc 建议)

  4. 创建一个与 TangoARCamera 具有相同固有(投影矩阵)的相机,并且只渲染 PointCloud 的图层。这个相机将是我们的深度相机(相机只渲染 PointCloud)。

  5. 将深度相机设置为 TangoARCamera 对象的子对象,没有偏移。这确保相机具有与 ARCamera 完全相同的运动(位置和方向)。

  6. 创建另一个RGBA格式的渲染纹理,并将此纹理赋给TangoARCamera得到彩色图像。

  7. 现在你有两种纹理:深度和颜色。它们保证同步,因为在 UnitySDK 中,PointCloud 预制件实际上将点投射到世界中 space,并且 TangoARCamera 的变换根据彩色相机时间戳进行更新。