TangoImageBuffer RAW/YUV 无法匹配帧

TangoImageBuffer RAW/YUV failed to match frame

我使用 OnFrameAvailable 回调将 rgb 与深度数据同步。如果我只渲染 rgb 点云,一切都很好。

但是如果我进行一些图像处理,相机会抛出以下异常:

E/camera-metadata: /home/ubuntu/jobs/redwood_internal/RedwoodInternal/Redwood/common/player-engine/src/camera-metadata.cc:56 RAW failed to match frame

E/camera-metadata: /home/ubuntu/jobs/redwood_internal/RedwoodInternal/Redwood/common/player-engine/src/camera-metadata.cc:56 YUV failed to match frame

并且 TangoImageBuffer 具有完整的垃圾值。有时黑色像素,或缓冲区新旧像素数据各一半。

我试着用线程解决了。每次我得到一个新的点云,额外的图像处理线程需要大约 1 秒 cpu 时间。这有点帮助。几秒钟后,同样的行为发生了。

问题是我无法正确调试本地代码。 android studio 的监控显示 cpu 和 gpu 使用正常。

我看到用户 guppy 有这个 problem with the Leipniz tango version,但没有发布解决方案。所以我希望也许其他人已经解决了这个问题?或者有什么建议?

编辑

使用 tango_support 库复制 xyz 和 yuv 缓冲区后,该行为消失了。

"YUV failed to match frame" 很可能是回调线程执行时间过长造成的。简而言之,您不应该在 OnFrameAvailable 回调中进行繁重的处理。这也适用于所有其他 Tango 回调,即姿势或深度回调。

这个问题的解决方案是复制字节缓冲区数据并在另一个线程(可能是渲染线程)中处理它。在 tango-example-c video-overlay-jni-example, the application does a memcpy to copy the data from callback thread to the render thread, so the processing of the data would not block the callbacks keep coming. See this line 中。