0

ARKit 以 60 帧/秒的速度运行,相当于每帧 16.6 毫秒。

我当前将 CVPixelBufferRef (kCVPixelFormatType_420YpCbCr8BiPlanarFullRange 格式) 转换为 cv::Mat (YCrCb) 的代码在 30 毫秒内运行,这会导致 ARKit 停止并且一切都滞后。

有没有人对如何更快地转换有任何想法,或者我是否需要降低帧速率?

Apple 建议使用 Metal,但我不知道该怎么做。

我也可以只取灰度平面,这是第一个通道,运行时间 <1ms,但理想情况下我也需要颜色信息。

4

2 回答 2

3

为了使用 Metal 处理像素缓冲区中的图像,您需要执行以下操作。

  1. 调用 CVMetalTextureCacheCreateTextureFromImage 在像素缓冲区之上创建 CVMetalTexture 对象。
  2. 调用 CVMetalTextureGetTexture 创建一个 MTLTexture 对象,Metal 代码 (GPU) 可以读取和写入该对象。
  3. 编写一些 Metal 代码来转换颜色格式。

我有一个开源项目(https://github.com/snakajima/vs-metal),它使用 Metal 处理像素缓冲区(来自相机,而不是 ARKit)。随意复制此项目中的任何代码。

于 2017-07-05T18:13:09.397 回答
1

我尝试将 Ycbcr 转换为 RGB,在 RGB mat 中进行图像处理并将其转换回 Ycbcr,它工作得非常缓慢。我建议只使用静态图像。对于实时处理,我们应该直接在 cv::Mat 中处理。ARFrame.capturedImage 是 Ycbcr 缓冲区。所以,解决方案是

  1. 将缓冲区分散到 2 cv::Mat(yPlane 和 cbcrPlane)。请记住,我们不克隆内存,我们创建 2 个 cv::Mat 基地址是 yPlane 地址和 cbcrPlane 地址。
  2. 在 yPlane 和 cbcrPlane 上进行图像处理,size(cbcrPlane) = size(yPlane) / 2。

你可以在这里查看我的代码:https ://gist.github.com/ttruongatl/bb6c69659c48bac67826be7368560216

于 2018-11-14T17:12:18.037 回答