ios - GPUImage : YUV or RGBA impact on performance?

标签 ios image-processing gpuimage

我正在处理一些静态图像处理,GPUImage 是一个非常棒的框架(谢谢 Brad Larson!)。

我的理解是:

  • 一些过滤器只需要一个组件就可以完成。在这种情况下,图像应该是 YUV (YCbCr),我们只使用 Y(亮度 = 图像灰度)。
  • 其他过滤器需要来自 3 个分量(R、G 和 B)的所有颜色信息。
  • 提供 YUV -> RGB 转换(在 GPUVideoCamera 中),RGB -> YUV 可以硬编码到片段着色器中(例如:GPUImageChromaKeyFilter)

我有很多图像处理步骤,有些可以基于 YUV,有些可以基于 RGB。 基本上,我想混合 RGB 和 YUV 滤镜,所以我的一般问题是:

这种连续转换的成本/信息损失是多少,您会推荐任何设计吗?

谢谢!

(PS:iPhone4 YUV->RGB 转换和AVCaptureStillImageOutput 像素格式有什么问题?)

最佳答案

在 GPUImage 中使用 YUV 是一个相当新的添加,我仍在试验中。我想引入 YUV 来尝试提高过滤器性能、减少内存使用并可能提高颜色保真度。到目前为止,我的修改只实现了这三个中的一个。

如您所见,我从相机中提取 YUV 帧,然后决定在过滤器管道的后续阶段如何处理它们。如果相机输入目标的所有过滤器只需要单色输入,则相机输入将只发送未处理的 Y channel 纹理到管道。如果任何滤镜需要 RGB 输入,相机输入将执行基于着色器的 YUV->RGB 转换。

对于采用单色的过滤器,这可以通过消除 RGB 转换阶段(由 AV Foundation 在请求 BGRA 数据时或在我的转换着色器中完成)以及冗余转换来显着提高性能RGB 回到亮度。在 iPhone 4 上,在 720p 帧上运行的 Sobel 边缘检测过滤器的性能从使用 RGB 输入的每帧 36.0 ms 到使用直接 Y channel 的 15.1 ms。这也避免了由于将 YUV 转换为 RGB 并返回亮度的舍入而导致的轻微信息丢失。 8 位颜色 channel 只有这么多的动态范围。

即使在使用 RGB 输入时,这种转换从 AV Foundation 移出并进入我的着色器也会带来性能上的提升。在 iPhone 4S 上,使用我的转换着色器而不是 AV Foundation 的内置 BGRA 输出,针对 1080p 输入运行饱和过滤器从每帧 2.2 毫秒下降到每帧 1.5 毫秒。

两种 RGB 方法的内存消耗几乎相同,因此我正在尝试一种改进方法。对于单色输入,由于输入的纹理尺寸较小,内存使用量会显着下降。

实现全 YUV 管道更具挑战性,因为您需要为 Y 和 UV 平面维护并行渲染路径和着色器,并为两者提供单独的输入和输出纹理。从 RGB 中提取平面 YUV 很棘手,因为您需要以某种方式从一个输入中提取两个输出,而这在 OpenGL ES 中是不支持的。您需要执行两次渲染过程,这是相当浪费的。交错 YUV444 作为多级管道的颜色格式可能更实用,但我还没有尝试过这个。

同样,我才刚刚开始修补它。

关于ios - GPUImage : YUV or RGBA impact on performance?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15004621/

相关文章:

ios - 如何设置 MKPlacemark 的显示名称?

ios - 图片IO : PNG invalid PNG file: iDOT doesn't point to valid IDAT chunk

image-processing - libvips 旋转在设备上没有剩余空间

python - 在 Python 中识别图像

image-processing - 帮助 OpenCV cvInitUndistortRectifyMap 和单个相机

ios - 无法通过 GPUImage 播放录像机

ios - 跟踪 GPUImage processImage 的进度(iOS)

iphone - cocos2d 支持视网膜 iPhone 和低清晰度 iPad,但不支持视网膜 iPad?

ios - 来自对象的一些数据要么不保存要么不加载

ios - 为单个视频添加多个滤镜