Janie Larson
@RedQueenCoder @RedQueenCoder@appdot.net
Brad Larson
http://www.sunsetlakesoftware.com
contact@sunsetlakesoftware.com
GPUImage 3 是 GPUImage 框架的第三代,这是一个开源项目,用于在 Mac 和 iOS 上执行 GPU 加速的图像和视频处理。 最初的 GPUImage 框架是用 Objective-C 编写的,目标是 Mac 和 iOS,第二个迭代版本使用 OpenGL 在 Swift 中重写,目标是 Mac、iOS 和 Linux,而现在的第三代版本则被重新设计为使用 Metal 代替 OpenGL。
该框架的目标是尽可能轻松地设置和执行针对图像或视频源的实时视频处理或机器视觉。 该框架的先前迭代版本包装了 OpenGL (ES),隐藏了使用自定义顶点和片段着色器在 GPU 上渲染图像所需的大量样板代码。 此版本的框架用 Metal 替换了 OpenGL (ES)。 主要受 Apple 在其平台上弃用 OpenGL (ES) 而转向 Metal 的推动,这将允许探索优于 OpenGL 的性能优化,以及与基于 Metal 的框架和操作更紧密的集成。
API 是 GPUImage 2 中使用的 API 的克隆版本,旨在作为该框架版本的直接替代品。 在框架的 Metal 和 OpenGL 版本之间进行交换应该像更改应用程序链接的框架一样简单。 一些底层接口,例如围绕纹理输入和输出的接口,必然是 Metal 或 OpenGL 特定的,但其他一切都旨在在两者之间兼容。
截至目前,我们不接受来自外部贡献者的增强请求。 我们正在积极努力在 GPUImage 的此版本和先前版本之间移植所有功能。 一旦此任务完成,我们将很乐意接受社区贡献。
BSD 风格,完整许可证随框架在 License.txt 中提供。
该框架依赖于处理管道的概念,其中图像源针对图像消费者,依此类推,直到图像输出到屏幕、图像文件、原始数据或录制的影片。 摄像头、影片、静态图像和原始数据可以作为此管道的输入。 可以通过一系列较小操作的组合来构建任意复杂的处理操作。
这是一个面向对象的框架,其中的类封装了输入、处理操作和输出。 处理操作使用 Metal 顶点和片段着色器在 GPU 上执行图像操作。
下面显示了在常见应用程序中使用该框架的示例。
GPUImage 以 Swift 包的形式提供。 要将其添加到您的 Mac 或 iOS 应用程序,请转到您的项目设置,选择“Package Dependencies”(包依赖项),然后单击加号按钮。 在右上角输入此存储库的 URL,然后按 Enter 键。 GPUImage 将显示为项目的包依赖项。
在任何引用 GPUImage 类的 Swift 文件中,只需添加
import GPUImage
您应该就可以开始使用了。
请注意,您可能需要构建项目一次以解析和构建 GPUImage 框架,以便 Xcode 停止警告您框架及其类丢失。
要过滤来自 Mac 或 iOS 摄像头的实时视频,您可以编写如下代码
do {
camera = try Camera(sessionPreset:.vga640x480)
filter = SaturationAdjustment()
camera --> filter --> renderView
camera.startCapture()
} catch {
fatalError("Could not initialize rendering pipeline: \(error)")
}
其中 renderView 是您放置在视图层次结构中某处的 RenderView 的实例。 上述代码实例化了一个 640x480 摄像头实例,创建了一个饱和度滤镜,并将摄像头帧定向为通过饱和度滤镜处理,然后显示到屏幕上。 startCapture() 启动摄像头捕获过程。
--> 运算符将图像源链接到图像消费者,并且可以在同一行中链接许多此类运算符。
功能未完成。
功能未完成。
功能未完成。
功能未完成。
该框架使用一系列协议来定义可以输出要处理的图像、接收要处理的图像或两者兼而有之的类型。 这些分别是 ImageSource、ImageConsumer 和 ImageProcessingOperation 协议。 任何类型都可以遵守这些协议,但通常使用类。
许多常见的滤镜和其他图像处理操作可以描述为 BasicOperation 类的子类。 BasicOperation 提供了从一个或多个输入接收图像帧、使用指定的着色器程序从这些输入渲染矩形图像(四边形)以及将该图像提供给其所有目标所需的大部分内部代码。 BasicOperation 的变体,例如 TextureSamplingOperation 或 TwoStageOperation,向着色器程序提供了某些类型的操作可能需要的其他信息。
要构建一个简单的单输入滤镜,您甚至可能不需要创建自己的子类。 您只需在实例化 BasicOperation 时提供片段着色器和所需的输入数量即可
let myFilter = BasicOperation(fragmentFunctionName:"myFilterFragmentFunction", numberOfInputs:1)
着色器程序由匹配的顶点和片段着色器组成,这些着色器被编译并链接到一个程序中。 默认情况下,该框架使用一系列基于输入到操作中的图像数量的库存顶点着色器。 通常,您只需要提供用于执行过滤或其他处理的自定义片段着色器即可。
GPUImage 使用的片段着色器如下所示
#include <metal_stdlib>
#include "OperationShaderTypes.h"
using namespace metal;
fragment half4 passthroughFragment(SingleInputVertexIO fragmentInput [[stage_in]],
texture2d<half> inputTexture [[texture(0)]])
{
constexpr sampler quadSampler;
half4 color = inputTexture.sample(quadSampler, fragmentInput.textureCoordinate);
return color;
}
并保存在 .metal 文件中,这些文件与框架/您的项目同时编译。
如果您希望将一系列操作分组到一个单元中以传递,则可以创建 OperationGroup 的新实例。 OperationGroup 提供了一个 configureGroup 属性,该属性接受一个闭包,该闭包指定应如何配置组
let boxBlur = BoxBlur()
let contrast = ContrastAdjustment()
let myGroup = OperationGroup()
myGroup.configureGroup{input, output in
input --> self.boxBlur --> self.contrast --> output
}
进入 OperationGroup 的帧由上述闭包中的输入表示,而整个组输出的帧由输出表示。 设置完成后,上面的 myGroup 将像任何其他操作一样显示,即使它由多个子操作组成。 然后可以像单个操作一样传递或处理此组。
[待办事项:为 Metal 重做]
该框架使用几种平台无关的类型来表示常用值。 通常,浮点输入以 Floats 形式接收。 尺寸使用 Size 类型指定(通过使用宽度和高度初始化构造)。 颜色通过 Color 类型处理,您可以在其中为红色、绿色、蓝色以及可选的 alpha 分量提供归一化为 1.0 的颜色值。
位置可以以 2D 和 3D 坐标提供。 如果仅通过指定 X 和 Y 值来创建 Position,则将其视为 2D 点。 如果还提供了可选的 Z 坐标,则将其视为 3D 点。
矩阵有 Matrix3x3 和 Matrix4x4 两种类型。 这些矩阵可以使用 Floats 的行优先数组构建,也可以从 CATransform3D 或 CGAffineTransform 结构初始化。
操作当前正在从 GPUImage 2 移植过来。 以下是目前可用的操作
亮度调整 (BrightnessAdjustment):调整图像的亮度。 详细描述请参见 此处。
曝光调整 (ExposureAdjustment):调整图像的曝光度。 详细描述请参见 此处。
对比度调整 (ContrastAdjustment):调整图像的对比度。 详细描述请参见 此处。
饱和度调整 (SaturationAdjustment):调整图像的饱和度。 详细描述请参见 此处。
伽玛调整 (GammaAdjustment):调整图像的伽玛值。 详细描述请参见 此处。
色阶调整 (LevelsAdjustment):类似 Photoshop 的色阶调整。 minimum、middle、maximum、minOutput 和 maxOutput 参数是 [0, 1] 范围内的浮点数。 如果您的参数来自 Photoshop,范围为 [0, 255],则必须先将其转换为 [0, 1]。 gamma/mid 参数是 >= 0 的浮点数。 这与 Photoshop 中的值匹配。 如果要将色阶应用于 RGB 以及各个通道,则需要使用此滤镜两次 - 首先用于各个通道,然后用于所有通道。
颜色矩阵滤镜 (ColorMatrixFilter):通过将矩阵应用于图像的颜色来转换颜色
RGB 调整 (RGBAdjustment):调整图像的各个 RGB 通道。 详细描述请参见 此处。
白平衡 (WhiteBalance):调整图像的白平衡。
高光和阴影 (HighlightsAndShadows):调整图像的阴影和高光
色相调整 (HueAdjustment):调整图像的色相
颜色反转 (ColorInversion):反转图像的颜色。 详细描述请参见 此处。
亮度 (Luminance):将图像简化为仅其亮度(灰度)。 详细描述请参见 此处。
单色滤镜 (MonochromeFilter):根据每个像素的亮度将图像转换为单色版本
雾霾 (Haze):用于添加或去除雾霾(类似于紫外线滤镜)
棕褐色调滤镜 (SepiaToneFilter):简单的棕褐色调滤镜
不透明度调整 (OpacityAdjustment):调整传入图像的 alpha 通道
亮度阈值 (LuminanceThreshold):亮度高于阈值的像素将显示为白色,低于阈值的像素将显示为黑色
自然饱和度 (Vibrance):调整图像的自然饱和度
高光和阴影色调 (HighlightAndShadowTint):允许您使用颜色和强度独立地为图像的阴影和高光着色
{1.0f, 0.0f, 0.0f, 1.0f}
(红色)。{0.0f, 0.0f, 1.0f, 1.0f}
(蓝色)。查找滤镜 (LookupFilter):使用 RGB 颜色查找图像来重新映射图像中的颜色。 首先,使用您喜欢的照片编辑应用程序将滤镜应用于 framework/Operations/LookupImages 中的 lookup.png。 为了使其正常工作,每个像素颜色都不能依赖于其他像素(例如,模糊将不起作用)。 如果您需要更复杂的滤镜,您可以根据需要创建任意数量的查找表。 准备就绪后,将您的新 lookup.png 文件用作 PictureInput 的基础,您为 lookupImage 属性提供该 PictureInput。
Amatorka 滤镜 (AmatorkaFilter):基于 Amatorka 的 Photoshop 动作的照片滤镜:http://amatorka.deviantart.com/art/Amatorka-Action-2-121069631 。 如果要使用此效果,则必须将 GPUImage framework/Operations/LookupImages 文件夹中的 lookup_amatorka.png 添加到您的应用程序包中。
MissEtikate 滤镜 (MissEtikateFilter):基于 Miss Etikate 的 Photoshop 动作的照片滤镜:http://miss-etikate.deviantart.com/art/Photoshop-Action-15-120151961 。 如果要使用此效果,则必须将 GPUImage framework/Operations/LookupImages 文件夹中的 lookup_miss_etikate.png 添加到您的应用程序包中。
柔和优雅 (SoftElegance):另一个基于查找表的颜色重新映射滤镜。 如果要使用此效果,则必须将 GPUImage framework/Operations/LookupImages 文件夹中的 lookup_soft_elegance_1.png 和 lookup_soft_elegance_2.png 添加到您的应用程序包中。
颜色反转 (ColorInversion):反转图像的颜色
亮度 (Luminance):将图像简化为仅其亮度(灰度)。
单色滤镜 (MonochromeFilter):根据每个像素的亮度将图像转换为单色版本
伪色 (FalseColor):使用图像的亮度在两种用户指定的颜色之间混合
雾霾 (Haze):用于添加或去除雾霾(类似于紫外线滤镜)
棕褐色调滤镜 (SepiaToneFilter):简单的棕褐色调滤镜
亮度阈值 (LuminanceThreshold):亮度高于阈值的像素将显示为白色,低于阈值的像素将显示为黑色
自适应阈值 (AdaptiveThreshold):确定像素周围的局部亮度,然后如果像素低于该局部亮度则将其变为黑色,如果高于则变为白色。 这对于在不同的光照条件下挑选文本非常有用。
色度键控 (ChromaKeying):对于图像中的给定颜色,将 alpha 通道设置为 0。 这类似于 ChromaKeyBlend,只是它不使用第二张图像来混合匹配的颜色,而是不接收第二张图像,而只是将给定的颜色变为透明。
自然饱和度 (Vibrance):调整图像的自然饱和度
高光阴影色调 (HighlightShadowTint):允许您使用颜色和强度独立地为图像的阴影和高光着色
{1.0f, 0.0f, 0.0f, 1.0f}
(红色)。{0.0f, 0.0f, 1.0f, 1.0f}
(蓝色)。锐化 (Sharpen):锐化图像
高斯模糊 (GaussianBlur):硬件优化的可变半径高斯模糊
盒状模糊 (BoxBlur):硬件优化的可变半径盒状模糊
iOS 模糊 (iOSBlur):尝试复制 iOS 7 中在控制中心等位置使用的背景模糊效果。
中值滤镜 (MedianFilter):在 3x3 区域上取三个颜色分量的中值
倾斜移轴 (TiltShift):模拟倾斜移轴镜头效果
卷积 3x3 (Convolution3x3):对图像运行 3x3 卷积核
Sobel 边缘检测 (SobelEdgeDetection):Sobel 边缘检测,边缘以白色突出显示
Prewitt 边缘检测 (PrewittEdgeDetection):Prewitt 边缘检测,边缘以白色突出显示
阈值 Sobel 边缘检测 (ThresholdSobelEdgeDetection):执行 Sobel 边缘检测,但应用阈值而不是给出渐进强度值
局部二值模式 (LocalBinaryPattern):这会将周围 8 个像素的红色通道强度与中心像素的红色通道强度进行比较,并将比较结果编码为位字符串,该位字符串将成为此像素强度。 最低有效位是右上角比较,逆时针方向结束于右侧比较作为最高有效位。
颜色局部二值模式 (ColorLocalBinaryPattern):这会将周围 8 个像素的所有颜色通道强度与中心像素的颜色通道强度进行比较,并将比较结果编码为位字符串,该位字符串将成为每个颜色通道的强度。 最低有效位是右上角比较,逆时针方向结束于右侧比较作为最高有效位。
低通滤镜 (LowPassFilter):这会将低通滤镜应用于传入的视频帧。 这基本上累积了先前帧的加权滚动平均值以及传入的当前帧。 这可以用于对视频进行降噪、添加运动模糊或用于创建高通滤镜。
高通滤镜 (HighPassFilter):这会将高通滤镜应用于传入的视频帧。 这是低通滤镜的逆过程,显示当前帧与先前帧的加权滚动平均值之间的差异。 这对于运动检测最有用。
缩放模糊 (ZoomBlur):将定向运动模糊应用于图像
ColourFAST 特征检测 (ColourFASTFeatureDetection):提取图像的 ColourFAST 特征描述符
色度键混合 (ChromaKeyBlend):有选择地用第二张图像替换第一张图像中的颜色
溶解混合 (DissolveBlend):应用两张图像的溶解混合
正片叠底混合 (MultiplyBlend):应用两张图像的正片叠底混合
添加混合 (AddBlend):应用两张图像的加法混合
减去混合 (SubtractBlend):应用两张图像的减法混合
划分混合 (DivideBlend):应用两张图像的除法混合
叠加混合 (OverlayBlend):应用两张图像的叠加混合
变暗混合 (DarkenBlend):通过取图像之间每个颜色分量的最小值来混合两张图像
变亮混合 (LightenBlend):通过取图像之间每个颜色分量的最大值来混合两张图像
颜色加深混合 (ColorBurnBlend):应用两张图像的颜色加深混合
颜色减淡混合 (ColorDodgeBlend):应用两张图像的颜色减淡混合
滤色混合 (ScreenBlend):应用两张图像的滤色混合
排除混合 (ExclusionBlend):应用两张图像的排除混合
差异混合 (DifferenceBlend):应用两张图像的差异混合
强光混合 (HardLightBlend):应用两张图像的强光混合
柔光混合 (SoftLightBlend):应用两张图像的柔光混合
Alpha 混合 (AlphaBlend):根据第二张图像的 alpha 通道将第二张图像混合在第一张图像之上
源上混合 (SourceOverBlend):应用两张图像的源上混合
颜色加深混合 (ColorBurnBlend):应用两张图像的颜色加深混合
颜色减淡混合 (ColorDodgeBlend):应用两张图像的颜色减淡混合
正常混合 (NormalBlend):应用两张图像的正常混合
颜色混合 (ColorBlend):应用两张图像的颜色混合
色相混合 (HueBlend):应用两张图像的色相混合
饱和度混合 (SaturationBlend):应用两张图像的饱和度混合
亮度混合 (LuminosityBlend):应用两张图像的亮度混合
线性加深混合 (LinearBurnBlend):应用两张图像的线性加深混合
像素化 (Pixellate):对图像或视频应用像素化效果
极坐标像素化 (PolarPixellate):对图像或视频应用像素化效果,基于极坐标而不是笛卡尔坐标
波尔卡圆点 (PolkaDot):将图像分解为规则网格内的彩色圆点
半色调 (Halftone):对图像应用半色调效果,如新闻印刷
交叉阴影线 (Crosshatch):这会将图像转换为黑白交叉阴影线图案
素描滤镜 (SketchFilter):将视频转换为看起来像素描。 这只是颜色反转的 Sobel 边缘检测滤镜
阈值素描滤镜 (ThresholdSketchFilter):与素描滤镜相同,只是边缘被阈值化而不是灰度
卡通滤镜 (ToonFilter):这使用 Sobel 边缘检测在对象周围放置黑色边框,然后量化图像中存在的颜色,使图像具有卡通般的质量。
平滑卡通滤镜 (SmoothToonFilter):这使用与卡通滤镜类似的过程,只是在卡通效果之前使用高斯模糊来平滑噪声。
浮雕滤镜 (EmbossFilter):对图像应用浮雕效果
漩涡扭曲 (SwirlDistortion):在图像上创建漩涡扭曲
凸起扭曲 (BulgeDistortion):在图像上创建凸起扭曲
收缩扭曲 (PinchDistortion):创建图像的收缩扭曲
拉伸扭曲 (StretchDistortion):创建图像的拉伸扭曲
球体折射 (SphereRefraction):模拟通过玻璃球体的折射
玻璃球体折射 (GlassSphereRefraction):与 SphereRefraction 相同,只是图像未反转,并且玻璃边缘略微磨砂
晕影 (Vignette):执行晕影效果,在边缘淡出图像
KuwaharaRadius3Filter: Kuwahara 滤波器的修改版本,优化为仅在三个像素的半径内工作
CGAColorspace: 模拟 CGA 显示器的色彩空间
Solarize: 应用日晒效果