深入核心图像–第一部分

我已经完成了本文的大部分示例项目。 您可以在这里查看:

chriswebb09 / CoreCamera

通过在GitHub上创建一个帐户为CoreCamera开发做出贡献。

github.com

这篇文章标志着我将要在Core Image上写的一系列文章的开始。 那么为什么要使用Core Image? 低级处理图形可能会很混乱。 您走得越低,您对UIKit和Cocoa的追求就越远。 对于开发人员而言,幸运的是,Apple提供了用于与较低级图形进程进行交互的抽象/接口。 Core Image是这些抽象之一,它是在Apple生态系统中进行编码时经常会遇到的一个库。 从编辑静态图像到在实时视频内容上使用过滤器,Core Image的用途十分广泛,可以处理各种用例。

在我们开始之前,我只想警告您Core Image严重依赖KVO,这会使探索它有些困惑。 与您能够与之合作和操纵的世界相比,这个障碍显得苍白,所以我希望您坚持下去。

Core Image是一种图像处理和分析技术,旨在为静止图像和视频图像提供近乎实时的处理。 它使用GPU或CPU渲染路径处理来自Core Graphics,Core Video和Image I / O框架的图像数据类型。 -Apple文件

定义

  CIImage:是用于在Core Image中处理图像数据的图像数据格式。 这是有关如何处理图像的食谱书/说明。  CIFilters将CIImage用作输入,然后将它们传递回去。 由于CIImages的执行是延迟执行的,因此只有在将它们放入可渲染格式后,配方/指令才会被遵循。  CIContext:是用于使用Quartz 2D,Metal或OpenGL进行Core Image处理的图形处理和分析的评估上下文。  CIContext是线程安全的不可变对象,但与它们一起使用的CIFilter不是。  CIDetector:是图像处理过程,用于注意和分类图像上的区别特征。 对于可能是眼睛,耳朵,鼻子等的脸,或者可能是形状,例如盒子。  核心图像内核:核心图像内核是在每个单个像素上运行的小型算法。 内核使用过滤器的参数并基于该参数执行其算法。 每个过滤器至少包裹一个内核。 内核是在目标图像上的每个单个像素上执行的功能。 内核包含我们运行以生成输出图像的处理算法。 执行量高是GPU按其设计方式进行设计的原因。 每次执行看起来可能并不多,但是与所有像素协同工作,同时进行渲染,很明显,我们需要专门的东西来处理它们。  扭曲内核:扭曲内核专为移动,变形,平移图像而设计。 如果您已经阅读了我在ARKit上撰写的较早的系列文章,我们将使用矩阵转换将节点放置在3D空间中。 扭曲内核对像素执行操作以完成这些操作。  颜色内核:颜色内核是负责仅使用颜色的颜色的内核。 它接收一个作为分量向量的参数。 这些成分是红色,绿色,蓝色和Alpha。 如果听起来很熟悉,那是因为这些值通常用于使用UIColor制作自定义颜色。 

渲染过程

 低级 :低级处理任务由内核计算,内核例程必须返回向量( vec4 ),其中包含将源像素映射到目标像素的结果。  高级 :高级过程任务由Objective-C执行。 代码对硬件的直接影响越深,其抽象度就越高。 也就是说,内核对每个像素执行与硬件非常接近的操作,而CIContext负责更高级别的操作和数据。 

筛选器

  CIFilter - CoreImage中自定义过滤器是一个CIFilter,您可以为其编写一个名为kernel的例程,该例程指定要在每个源图像像素上执行的计算。  OpenGL着色器 -如果您不熟悉着色器,它们是在绘图操作期间按每个顶点或每个像素执行的小程序(还有几何着色器,它们对几何图元进行操作,但不会在本教程中介绍)。 

如果上述两个定义看起来非常相似,那是因为Apple使用OpenGL着色器语言的修改版来创建过滤器。 在OpenGL中,您经常会发现纹理用于为3D对象赋予某种实质。 例如,您可以有一个球体,然后用金属质感覆盖它,使其看起来像金属球。 Apple调用纹理过滤器,并将它们与CIFilter数据类型一起使用。

在图像处理中,可以将过滤器视为一种算法,该算法采用多个输入(包括图像)并生成输出图像。 过滤器是围绕内核的包装器,它是依次应用于图像中每个像素的算法。

GPU的时代已经到来。 加密货币和机器学习都在使用它们,苹果公司正在构建它们,但CPU仍然占有一席之地。 让我们看一下两种情况,我认为这两种情况将阐明CPU和GPU之间核心能力的差异。

方案一:考虑特斯拉和18轮式卡车之间的区别。 如果您想要一辆具有最新电子技术的车辆,它可以以120 mph的速度自动行驶,那么18轮式助推器就没什么用了。 可以,但是它有一个旧的柴油发动机,并且行驶速度不会比高速公路速度快得多。

方案二 :现在想象一下,您必须从火车上卸下所有棚车,然后将它们开到市中心的服装店。 卡车将在这里击败跑车。

  GPU: GPU的设计可以很好地完成一件事情,对大量数据执行并行处理。  CPU具有一些高度复杂的线程核,而GPU具有许多简单的核,可以同时执行许多操作。 尽管每个任务都非常简单,但是由于要计算的数据集大小很大,因此需要GPU。  CPU:尽管在某种程度上,CPU在图形处理方面具有处理自己的能力,但它们擅长执行复杂的逻辑,而不擅长处理大型数据集。 

Core Image通过提供易于使用的应用程序编程接口(API)来隐藏低级图形处理的细节。 您无需了解OpenGL,Op​​enGL ES或Metal的详细信息即可利用GPU的功能,也无需了解有关Grand Central Dispatch(GCD)的任何知识即可获得多核处理的优势。 Core Image会为您处理详细信息。 -Apple文件

定义

  Metal: Apple也有其他图形库。 最酷的一种是金属。  Metal是图形渲染/并行数据计算引擎。 实际上,这意味着速度很快。 它为您提供了对GPU的近乎直接访问以及并行计算的能力,这使Metal能够超越传统的屏幕图形领域,并进入移动机器学习的新领域。  GLKit: Apple提供GLKit作为OpenGL库的包装器。  GLKit使得访问OpenGL中提供的功能变得容易,而不必偏离iOS编程范例。  OpenGL:这使我们进入了OpenGL。  OpenGL是一种用于翻译2D和3D矢量图形的跨语言,跨平台的开源API。 语言本身是用C和C ++编写的。  Quartz 2D:有时被称为Quartz 2D,在其他情况下被称为Core Graphics,但最终,它在Apple的设备和平台上使用的是相同的二维绘图引擎。  Core Image位于Core Graphics和较低级别的GPU / CPU处理之间。 

如果GPU和CPU是卡车和跑车,那么Metal是Apple尝试制造混合动力卡车的尝试。 在所有这些程序中,Metal是性能最高的库,并且如上所述,应用程序超出了纯图形操作的范围。

包起来

既然我们已经掌握了大部分背景信息,那么我认为这是个总结的好地方。 在下一篇文章中,我们将深入研究代码!