iOS 图像处理流水线,GPUImage跟核心图像库比起来还强吗?

iOS image processing pipeline, is GPUImage still strong comparing with the core image lib?

我刚开始在 iOS 上开发图像处理应用程序,我在 OpenCV 方面有很多经验,但是 iOS 甚至 OSX 上的一切对我来说都是新的。

所以我发现主要有核心图像库和GPUImage库来进行正常的图像处理工作。我很想知道我应该在 iOS 平台上选择哪一个作为新产品?我已经在 iOS 8 和 iPhone 6 上看到了一些测试,看起来核心图像现在比 GPUImage 基准测试中的 GPUImage 快。

我实际上是在寻找图像处理开发的完整解决方案,

  1. 什么语言? Swift、Objective-C 或 Clang 和 C++ ?
  2. 什么图书馆? GPUImage 或 Core Image 或 OpenCV 或 GEGL ?
  3. 有示例应用程序吗?

我的目标是开发一些高级的校色功能,我希望尽快完成,这样以后我可以把图像处理变成视频处理没有太大问题。

谢谢

好吧,如果你正在做一些 ADVANCE 图像处理的东西,那么我建议使用 OpenGL ES(我假设我不需要涵盖 OpenGL 相对于 UIKit 或 Core Graphics 的好处)你可以从下面的教程开始.

http://www.raywenderlich.com/70208/opengl-es-pixel-shaders-tutorial https://developer.apple.com/library/ios/samplecode/GLImageProcessing/Introduction/Intro.html

我是 GPUImage 的作者,所以你可以适当权衡我的话。我在 my answer here 中详细描述了我对这个框架与 Core Image 的设计思想,但我可以重申一下。

基本上,我将 GPUImage 设计为 OpenGL / OpenGL ES 图像处理的便捷包装器。它是在 iOS 上不存在 Core Image 的时候构建的,即使当 Core Image 在那里发布时,它也缺少自定义内核并且存在一些性能缺陷。

与此同时,Core Image 团队在性能方面做了令人印象深刻的工作,导致 Core Image 现在在几个方面略胜 GPUImage。我仍然在其他方面击败了他们,但比以前更接近了。

我认为决定取决于您对应用程序的重视程度。您可以使用 GPUImage 的完整源代码,因此您可以根据需要自定义或修复其中的任何部分。您可以查看幕后情况,了解任何操作是如何运行的。流水线设计的灵活性让我可以尝试目前无法在 Core Image 中完成的复杂操作。

Core Image 标配 iOS 和 OS X。它被广泛使用(大量可用代码)、高性能、易于设置,并且(截至最新的 iOS 版本)可通过自定义内核进行扩展。除了 GPU 加速处理之外,它还可以进行 CPU 端处理,这使您可以在后台进程中执行诸如处理图像之类的操作(尽管您应该能够在后台执行有限的 OpenGL ES 工作 iOS 8).在我写GPUImage之前一直用Core Image

对于示例应用程序,请下载 GPUImage 源代码并在 examples/ 目录中查找。您将找到 Mac 和 iOS 以及 Objective-C 和 Swift 框架各个方面的示例。我特别推荐在您的 iOS 设备上构建和 运行 FilterShowcase 示例,因为它演示了实时视频框架中的每个过滤器。尝试是一件有趣的事情。

关于语言选择,如果视频/图像处理的性能是您所追求的,那么语言几乎没有什么区别。您的性能瓶颈不会是由于语言,而是 GPU 上的着色器性能以及图像和视频上传到 GPU 或从 GPU 下载的速度。

GPUImage 是用 Objective-C 编写的,但它仍然可以在它支持的最旧的 iOS 设备上以 60 FPS 的速度处理视频帧。对代码进行概要分析发现,消息发送开销或内存分配(与 C 或 C++ 相比,该语言中最慢的区域)甚至很少被注意到。如果这些操作是在 CPU 上完成的,情况会略有不同,但这都是 GPU 驱动的。

使用最适合和最容易满足您的开发需求的语言。 Core Image 和 GPUImage 都兼容 Swift、Objective-C++ 或 Objective-C。 OpenCV 可能需要使用来自 Swift 的垫片,但如果您在谈论性能,OpenCV 可能不是一个很好的选择。它会比 Core Image 或 GPUImage 慢得多。

就个人而言,就易用性而言,很难与 Swift 争论,因为我仅用 23 行非空白代码就可以使用 GPUImage 编写整个视频过滤应用程序。

我刚刚开源了 VideoShader,它允许您使用基于 JSON 的脚本语言描述视频处理管道。

https://github.com/snakajima/videoshader

例如"cartoon filter"可以用12行来描述。

{
    "title":"Cartoon I",
    "pipeline":[
        { "filter":"boxblur", "ui":{ "primary":["radius"] }, "attr":{"radius":2.0} },
        { "control":"fork" },
        { "filter":"boxblur", "attr":{"radius":2.0} },
        { "filter":"toone", "ui":{ "hidden":["weight"] } },
        { "control":"swap" },
        { "filter":"sobel" },
        { "filter":"canny_edge", "attr":{ "threshold":0.19, "thin":0.50 } },
        { "filter":"anti_alias" },
        { "blender":"alpha" }
    ]
}

它在运行时将这个脚本编译成GLSL(OpenGL的GPU着色语言),所有的像素操作都在GPU中完成。