我正在从点云点生成深度图,并填写我想要查看最接近的匹配颜色框的缺失数据。我能够生成一个深度图像(我在调用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个深度)。
答案 0 :(得分:2)
这个问题有多种解决方案,其中一种是bashbug建议的,缓冲帧并根据最接近的时间戳查找纹理。
我建议的不需要缓冲,它是Unity特定的:
启用PointCloud
上的网格渲染,并将PointCloud
对象设置为特定的layer。
渲染PointCloud
使用this doc中建议的着色器,但请确保关闭color mask,这样点云就不会渲染到颜色缓冲区。
创建RenderTexture
并使用depth format(建议previous doc)
创建一个与TangoARCamera
具有相同内在(投影矩阵)的相机,并仅渲染PointCloud
的图层。这台相机将是我们的深度相机(相机仅渲染PointCloud
)。
将深度相机设置为TangoARCamera
对象的子对象,没有偏移。这可确保相机具有与ARCamera完全相同的运动(位置和方向)。
使用RGBA格式创建另一个渲染纹理,并将此纹理指定给TangoARCamera
以获取彩色图像。
现在您有两种纹理:深度和颜色。它们保证同步,因为在UnitySDK中,PointCloud预制实际上在世界空间中投射点,并且TangoARCamera的变换基于彩色摄像机时间戳更新。