Ios GPUImage:YUV或RGBA对性能的影响?

Ios GPUImage:YUV或RGBA对性能的影响?,ios,image-processing,gpuimage,Ios,Image Processing,Gpuimage,我正在做一些静态图像处理,GPUImage是一个非常棒的框架(谢谢Brad Larson!) 我明白: 某些过滤器只能使用一个组件完成。在这种情况下,图像应该是YUV(YCbCr),我们只使用Y(luma=图像灰度) 其他过滤器需要来自3个组件(R、G和B)的所有颜色信息 提供了YUV->RGB转换(在GPUVideoCamera中),RGB->YUV可以硬编码到片段着色器中(例如:GPUImageChromaKeyFilter) 我有很多图像处理步骤,一些可以基于YUV,另一些可以基于RG

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

我明白:

  • 某些过滤器只能使用一个组件完成。在这种情况下,图像应该是YUV(YCbCr),我们只使用Y(luma=图像灰度)
  • 其他过滤器需要来自3个组件(R、G和B)的所有颜色信息
  • 提供了YUV->RGB转换(在
    GPUVideoCamera
    中),RGB->YUV可以硬编码到片段着色器中(例如:
    GPUImageChromaKeyFilter
我有很多图像处理步骤,一些可以基于YUV,另一些可以基于RGB。 基本上,我想混合RGB和YUV过滤器,所以我的一般问题是:

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

谢谢


(PS:iPhone4 YUV->RGB转换和AVCaptureStillImageOutput的问题是什么?

在GPUImage中使用YUV是一个全新的功能,我还在尝试。我想引入YUV以提高过滤器性能,减少内存使用,并可能提高颜色保真度。到目前为止,我的修改只实现了这三项中的一项

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

对于单色的滤波器,这可以在消除RGB转换阶段(当请求BGRA数据,或者在我的转换着色器中进行AV基础),以及RGB返回到亮度的冗余转换时,导致显著的性能提升。在iPhone4上,在720p帧上运行的Sobel边缘检测过滤器的性能从带有RGB输入的每帧36.0毫秒提高到使用直接Y通道的15.1毫秒。这也避免了由于将YUV转换为RGB并返回到亮度而产生的舍入而导致的轻微信息丢失。8位彩色通道只有这么多的动态范围

即使在使用RGB输入时,这种转换从AV基础转移到我的着色器中,也会带来性能上的胜利。在iPhone4S上,使用my conversion shader,而不是AV Foundation的内置BGRA输出,对1080p输入运行饱和过滤器,每帧从2.2毫秒下降到1.5毫秒

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

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


再一次,我刚刚开始修补这个问题。

我对iPhone 4的简短测试表明,除了明显的内存使用/带宽外,BGRA没有超过420v/420f的性能损失,而在iPhone 3G上,YUV在mediaserver上消耗了大量CPU,而2vuy和BGRA则没有问题。由于yuvs本质上是字节交换2vuy,因此只有在BGRA不进行转换的情况下,它才应该比BGRA慢。我还寻找了BGRA帧中降低的亮度带宽,但没有找到。不过,从iOS 4.3开始,我就没有进行过测试。谢谢你给出了完整的答案:性能数据很有趣!关于设计,在我的例子中,我是在静态图像上计算的,我在玩其他颜色空间(HSV,也许是CIELab…)。我想我可以拿着一张“源”图像——YUV或RGB——并在需要的时候回到这个源(我正在想象基于同一源图像的独立图像处理,每一个都提供信息反馈,然后我用来转换原始图片……我还不知道这是否符合我的需要)