iOS 5.0 中的核心图像滤镜在实时视频处理中是否足够快?

37

现在苹果已经将核心图像框架移植到iOS 5.0,我想知道:Core Image是否足够快速地应用实时滤镜和效果于相机视频中?

此外,有没有一个好的学习iOS 5.0的核心图像框架的起点?

3个回答

55

如今Core Image已经在iOS上发布了一段时间,我们可以谈谈一些具体的性能数据。我创建了一个基准应用程序,作为对我的GPUImage框架进行测试,并分析了使用原始CPU滤镜、Core Image滤镜和GPUImage滤镜处理实时视频流时的性能。以下是每个操作单个gamma滤镜用于对来自iPhone相机的640x480视频帧进行处理所需的时间(以毫秒为单位),针对两种不同硬件��号运行两个不同操作系统版本:

             iPhone 4 (iOS 5)   | iPhone 4S (iOS 6)
------------------------------------------------
CPU          458 ms (2.2 FPS)     183 ms (5.5 FPS)
Core Image   106 ms (6.7 FPS)     8.2 ms (122 FPS)
GPUImage     2.5 ms (400 FPS)     1.8 ms (555 FPS)

对于Core Image而言,在iPhone 4上,简单的gamma滤镜最多只能达到9.4 FPS,但在iPhone 4S上可以达到超过60 FPS。这是您可以设置的最简单的Core Image滤镜案例,因此性能肯定会随着更复杂的操作而变化。这似乎表明,在运行iOS 5的iPhone 4上,Core Image无法以足够快的速度进行实时处理以匹配iPhone相机的速率,但自从iOS 6开始,它处理视频的速度已经足够快,可以在iPhone 4S及以上设备上进行实时滤镜处理。

这些基准测试的来源可以在我的GitHub存储库中找到,如果您想了解我从哪里得到这些数字。

我从原来的答案中更新了这个答案,因为原先对Core Image的性能评价太严厉了。我用作比较标准的棕褐色调滤镜没有执行与我的滤镜相同的操作,所以那是一个糟糕的基准。Core Image滤镜的性能也在iOS 6中显着提高,这有助于使它们的处理速度足够快,可以在iPhone 4S及以上设备上实时处理视频。此外,我后来发现几种情况,比如大半径模糊,在这些情况下,Core Image明显优于我的GPUImage框架。

原先的答案,供参考:

与任何性能相关的问题一样,答案将取决于您的滤镜的复杂性、正在过滤的图像大小以及您运行的设备的性能特征。

由于Core Image在Mac上已经可用了一段时间,我可以向您介绍Core Image编程指南作为学习该框架的资源。鉴于保密协议的限制,我无法评论iOS特定的元素,但是我强烈建议观看WWDC 2011会议422 - 在iOS和Mac OS X上使用Core Image的视频。

核心图像(大部分)使用GPU进行图像处理,因此您可以查看现有设备上OpenGL ES 2.0着色器处理图像的速度。我最近在这个领域做了一些工作,发现iPhone 4能够在实时输入480 x 320的视频并使用简单着色器进行60 FPS处理。您可以下载我的示例应用程序,并尝试自定义着色器和/或视频输入大小,以确定您的特定设备是否能以良好的帧率处理此处理。Core Image可能会增加一些开销,但它也具有一些巧妙的优化方式来组织滤镜链。

最慢的兼容设备是iPhone 3G S和第三代iPod touch,但它们与iPhone 4相比并没有那么慢。iPad 2则以其巨大的片段处理能力远超它们所有其他设备。


你在上面的比较表中使用了什么类型的CIContext?是基于CPU还是GPU的?顺便说一句:我刚刚瞥了一眼你的GPUImage框架,看起来很棒!干得好! - Błażej
1
@Błażej - 就我所知,这是基于GPU的。我不得不验证这些数字,但它看起来像是在iPhone 4上处理时Core Image超载了GPU。很明显,Core Image的目标是面向新的基于A5的设备,而不是iPhone 3G S、iPhone 4或原始iPad。 - Brad Larson
嘿,布拉德,既然Core Image和GPUImage(从名称上看)都是基于GPU的计算,为什么GPUImage要快得多? - tom
4
@tom - Core Image和GPUImage在应用滤镜到图像和视频源方面有根本不同的方法。我选择手动调整单个片段着色器以适应硬件,这可以带来显著的性能提升。然而,我需要根据Core Image团队的一些评论更新上述基准测试结果。我仍然比Core Image更快,但在5.0上它并不像我的最初基准测试结果那样慢。iOS 6.0也带来了一些改进。 - Brad Larson
嗨@BradLarson,非常感谢您创建了这样一个惊人的库。我正在使用CropFilter来裁剪已经创建好的视频,但是它花费了太多时间来裁剪视频。您有什么解决方案可以提高裁剪速度吗?对于一分钟的视频,它需要1.3分钟才能完成裁剪,这太长了。所以,您能否建议我一些优化技巧。 - Parvez Belim

6
在iOS6.0及以上版本中,我认为Core Image始终是您的首选。以下是一些您会喜欢的优秀功能:
  1. Core Image输入参数支持glTexture2d;
  2. Core Image输出参数支持glTexture2d;
  3. 您可以选择仅使用GPU来使用CI。初始化一个CIContext,例如:_CIglContext = [CIContext contextWithEAGLContext:_glContext options:opts];
  4. 许多滤镜现在已经可用于iOS平台,大约有93种滤镜?
  5. 当您的应用程序暂时在后台运行时,您可以选择仅使用CPU处理缓冲区,但这并不推荐。
这些都在WWDC2012会议视频的Core Image部分中提到。看一看,也许您会在那里找到解决方案。

3

iPhone 4及以上的版本将实现几乎实时的操作。iPhone 3GS会有些卡顿。不建议在iPhone 3及更早版本上使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接