0

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

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

因此,未能触发 xyz 回调并不总是发生,但通常有一半的时间,在测试期间,有一个糟糕的解决方法,就是将应用程序置于后台,然后再次置于前台......这很奇怪,这是否与“恢复”相关暂停/恢复低级别的东西??)。如果有人有线索....顺便说一句,在Java API中,观察到相同的副作用,一旦连接凸轮纹理进行显示(通过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 相同的(颜色)格式作为低级捕获?

4

1 回答 1

0

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

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

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

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

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

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

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

于 2015-01-28T16:14:46.223 回答