【问题标题】:connectOnFrameAvailable() provides TangoImageBuffer with curious format infosconnectOnFrameAvailable() 为 TangoImageBuffer 提供了奇怪的格式信息
【发布时间】:2015-12-12 23:16:30
【问题描述】:

还试图从 Tango 的彩色摄像头访问颜色数据字节,我被困在 java API 上,因为我能够将探戈摄像头连接到表面进行显示(但实际上显示还可以,不容易访问 raw数据,也不是时间戳)...所以最后我在本机代码(最新的 FERMAT 库和标头)上使用 C API 并遵循我在堆栈溢出中找到的建议,将派生示例代码注册到connectOnFrameAvailable()...(我开始使用 PointCloudActivity 示例进行该测试)。

  • 我发现的第一个问题是注册到该回调的一些副作用,通常工作正常(回调定期触发),但随后我也注册的另一个回调,以获得 xyz 云,开始无法触发。就像我提到的示例代码一样,云通过onXYZijAvailable() 回调获得,应用使用TangoService_connectOnXYZijAvailable(onXYZijAvailable) 注册。

所以未能触发 xyz 回调并不总是发生,但通常有一半的时间,在测试期间,有一个糟糕的解决方法,就是将应用程序置于后台,然后再次置于前台......这很奇怪,这是“恢复”与暂停/恢复低级别的东西有关??)。如果有人有线索.... 顺便说一句,在 Java API 中,观察到相同的副作用,一旦连接 cam 纹理进行显示(通过 Tango 足够的 API ...)

但这是我的第二个“问题”,回到从相机获取 YV12 颜色数据: 通过注册到 TangoService_connectOnFrameAvailable(TangoCameraId::TANGO_CAMERA_COLOR, nullptr, onFrameAvailable) 并提供像这样定义的静态函数 onFrameAvailable:

static void onFrameAvailable(void* ctx, TangoCameraId id, const TangoImageBuffer* buffer)
{
   ...
   LOGI("OnFrameAvailable(): Cam frame data received");
   // Check if data format of expected type : YV12 , i.e.
   // TangoImageFormatType::TANGO_HAL_PIXEL_FORMAT_YV12 
   //  i.e.  = 0x32315659  // YCrCb 4:2:0 Planar
   //LOGI("OnFrameAvailable(): Frame data format (%x)", buffer->format);
   .... 
}

问题是接收到的 TangoImageBuffer 结构的宽度、高度、步幅信息似乎有效(1280x720,...),但返回的格式每次都在变化,而不是预期的幻数(此处为 0x32315659)... 我在那里做错了什么? (但其他信息还可以……)

此外,这里显然只定义了一种数据格式(YV12),但是从演示应用程序中看到鱼眼图像,似乎是灰度图像,它使用与 RGB cam 低级捕获相同的(颜色)格式吗? ??

【问题讨论】:

    标签: android colors google-project-tango


    【解决方案1】:

    1)关于来自相机的图像,我得出了与您相同的结论 - 只有图像数据的可用性是通过 C API

    2) 关于图像 - 我对 YUV 没有任何问题,我最后一次遇到这些东西是在我写 JPEG 的时候 - 格式是裸露的,即它是一种组织结构,没有标题信息保存第一行像素中未定义的元数据mentioned here - 这是一些代码的链接,可以帮助您解码图像以响应另一条消息here

    3) 关于点云返回 - 请注意,此信息是轶事,在某种程度上是迷信的产物 - 对我有用的只是有时对我有用,可能对你根本不起作用

    • Tango 似乎确实有一个非凡的诀窍,可以简单地停止生成点云。我认为这在很大程度上与内部非常敏感的时序有关(我想知道是否有人提到 Linux 在最初制作时不是 RTOS)
    • 我遇到的几乎所有问题都可以归因于搞砸了时间
    • A.调试 C 级别可能会停止点云的到来

    • B.本机或 Java 代码中的错误会导致处理回调的线程出现问题,这可能会导致点云停止出现

    • C.过大的负载会导致系统失去同步,此时点云将停止出现——这是可以检测到的,您将开始在图像的矩形区域看到银色网格图案,并且点云将停止。很少,如果负载减少,银色图案消失,点云回来,系统将恢复 - 更常见的是银色图案(我认为它是 3d 空间化网格)增长以覆盖更多图像 - 至少重新启动我需要应用程序,并且每 3 次左右重新启动一次完整的平板电脑

    总结一下,这是我的猜想和对策,但完全基于个人经验-

    【讨论】:

    • 我可以补充一下,我现在很确定 tango 会悄悄地判断你的回调函数需要多长时间执行 - 如果我在图像回调中解码相机图像,那么我突然之间就不用了't get point cloud callbacks - if I do that later in the render pass it's happy - 奇怪的是我认为这是同一个线程
    • 我确实注意到获取彩色图像的回调和获取鱼眼图像的回调在不同的线程中运行。是的,我认为您不希望您的回调函数进行大量处理。我想知道这个 logcat 消息是否与它有任何关系:“routeResultFromCAM:警告:传感器 0 上只有 3 个请求在飞行,可能会丢帧”。
    • 我昨天实际上看到了很多 - 不知何故,这与探戈回调绝对不应该回调到 java 中的事实有关,甚至不仅仅是设置全局 islocalized 标志 - 我会看到在上述针对探戈的罪行发生后不久(但不是当时),事情发生翻滚并死亡后的消息尸检。
    • 感谢您的 cmets。我终于使用具有足够互斥锁的渲染(不同?)线程将 yv12 数据转换为 RGBA 图像,但正如你们都提到的,回调时序(和整体系统负载)似乎对于获得稳定的东西至关重要。
    • @VincentAlleaume 你能获得没有伪影的图像吗?我的图像仍然在框架底部出现奇怪的线条(参见第二张图片here)。我实际上正在使用一个名为 vooya 的程序来显示原始 YV12 帧,并且还没有尝试转换为 RGBA...
    猜你喜欢
    • 1970-01-01
    • 2011-06-28
    • 2023-03-22
    • 2023-04-02
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    相关资源
    最近更新 更多