GPUImageWithMoltenGL 1.0.10

GPUImageWithMoltenGL 1.0.10

Allen Lin 维护。



  • By
  • Brad Larson

GPUImage

Brad Larson

http://www.sunsetlakesoftware.com

@bradlarson

[email protected]

概述

GPUImage 框架是一个BSD许可的iOS库,允许您将GPU加速的滤镜和其他效果应用于图像、实时摄像头视频和电影。与 Core Image(iOS 5.0 的一部分)相比,GPUImage 允许您编写自定义滤镜,支持部署到 iOS 4.0,并具有更简单的接口。然而,目前它缺少一些更高级的 Core Image 功能,如面部检测。

对于像处理图像或实时视频帧这样的大规模并行操作,GPU 在性能上比 CPU 有一些显著的优势。在 iPhone 4 上,一个简单的图像滤镜在 GPU 上执行的速度可以比等效的 CPU 基础滤镜快 100 多倍。

然而,在 GPU 上运行自定义滤镜需要大量的代码来设置和维护用于这些滤镜的 OpenGL ES 2.0 渲染目标。我创建了一个示例项目来做这个

http://www.sunsetlakesoftware.com/2010/10/22/gpu-accelerated-video-processing-mac-and-ios

并发现我在它的创建中有很多样板代码要写。因此,我将这个框架组织起来,封装了大量您在处理图像和视频时可能会遇到的常见任务,并确保您不需要关心 OpenGL ES 2.0 的底层支持。

这个框架在处理视频时与 Core Image 相比表现良好,iPhone 4 在从摄像头上传帧、应用 gamma 滤镜和显示时只需 2.5 毫秒,而使用 Core Image 进行相同操作需要 106 毫秒。基于 CPU 的处理需要 460 毫秒,这使得 GPUImage 在此硬件上的操作比 Core Image 快 40 倍,比 CPU 绑定处理快 184 倍。在 iPhone 4S 上,GPUImage 在这个案例中比 Core Image 快 4 倍,比 CPU 绑定处理快 102 倍。然而,对于像在大半径上的高斯模糊等更复杂的操作,Core Image 目前超越了 GPUImage。

许可

BSD风格的许可证,完整的许可证可在框架的License.txt文件中找到。

技术要求

  • OpenGL ES 2.0:使用该技术的应用在原始iPhone、iPhone 3G以及第一代和第二代iPod touch上无法运行。
  • 作为部署目标iOS 4.1(iOS 4.0不支持读取电影所需的某些扩展)。如果您希望在拍摄静态照片时显示实时视频预览,所需的部署目标为iOS 4.3。
  • 构建需要iOS 5.0 SDK。
  • 设备必须配备摄像头才能使用与摄像头相关的功能(显然)。
  • 该框架使用自动引用计数(ARC),但如果作为一个子项目添加,应支持同时使用ARC和手动引用计数的项目。对于针对iOS 4.x的目标的手动引用计数应用程序,您需要在应用程序项目的其他链接器标志中添加-fobjc-arc。

一般架构

GPUImage使用OpenGL ES 2.0着色器来执行图像和视频处理,速度快于在CPU中完成。但是它通过简化的Objective-C接口隐藏了与OpenGL ES API交互的复杂性。该接口允许您定义图像和视频的输入源,将筛选器以链的形式附加,并将使用处理后生成的图像或视频发送到屏幕、UIImage或磁盘上的电影。

图像或视频帧是从作为GPUImageOutput子类的源对象上传的,包括GPUImageVideoCamera(用于来自iOS相机的实时视频)、GPUImageStillCamera(用于拍照)、GPUImagePicture(用于静态图像)和GPUImageMovie(用于电影)。源对象将静态图像帧上传到OpenGL ES作为纹理,然后将这些纹理交给处理链中的下一个对象。

筛选器和其他随后元素遵守GPUImageInput协议,允许它们接收来自链中上一链接的提供的或处理过的纹理,并对其进行处理。链中的一步更远的对象被认为是目标,并且可以通过向单个输出或筛选器添加多个目标来实现处理分支。

例如,如果一个应用从摄像头捕获实时视频,将其转换为棕褐色调,然后将视频显示在屏幕上,将会设置一个如下所示的链:

GPUImageVideoCamera -> GPUImageSepiaFilter -> GPUImageView

将静态库添加到您的iOS项目中

注意:如果您想在Swift项目中使用此库,请使用“将此作为框架添加”部分中的步骤,而不是以下步骤。Swift需要第三方代码的模块。

一旦您获得框架的最新源代码,将其添加到您的应用程序中相对简单。首先,将GPUImage.xcodeproj文件拖动到您的应用程序的Xcode项目中,以嵌入框架到您的项目中。接下来,进入您的应用程序的目标并添加GPUImage作为目标依赖项。最后,您需要将GPUImage框架 Products 文件夹中的libGPUImage.a库拖动到应用程序目标中“链接二进制与库”构建阶段。

GPUImage需要将一些其他框架链接到您的应用程序中,所以您需要在应用程序目标中添加以下链接库:

  • CoreMedia
  • CoreVideo
  • OpenGLES
  • AVFoundation
  • QuartzCore

您还需要找到框架头文件,所以请在您的项目构建设置中将头文件搜索路径设置为从应用程序到GPUImage源目录中“框架/”子目录的相对路径。使此头文件搜索路径递归。

要在您的应用程序中使用GPUImage类,只需使用以下方式包含核心框架头文件:

#import "GPUImage.h"

注意事项:如果在尝试使用Interface Builder构建界面时遇到“在Interface Builder中未知的类GPUImageView”或类似错误,您可能需要在项目构建设置中的其他链接器标志中添加-ObjC。

另外,如果需要部署到iOS 4.x,当前版本的Xcode(4.3)要求您在最终应用程序中将Core Video框架弱链接,或者在创建用于上传至App Store或个人上传的归档时看到崩溃信息“未找到符号:_CVOpenGLESTextureCacheCreate”。为此,请转到项目中的构建阶段选项卡,展开“链接二进制与库”组,找到列表中的CoreVideo.framework。将列表右侧的设置从必需更改为可选。

此外,这是一个启用了ARC的框架,因此如果想在手动引用计数的iOS 4.x应用程序中使用此框架,您还需要将-fobjc-arc添加到其他链接器标志中。

在命令行中构建静态库

如果不想在应用程序的 Xcode 项目中将项目作为依赖项,您可以构建适用于 iOS 模拟器或设备的通用静态库。要做到这一点,请在命令行中运行 build.sh。生成的库和头文件将位于 build/Release-iphone。您还可以通过修改 build.sh 中的 IOSSDK_VER 变量来更改 iOS SDK 版本(所有可用版本均可使用 xcodebuild -showsdks 查找)。

将此作为框架(模块)添加到您的 Mac 或 iOS 项目中

Xcode 6 和 iOS 8 支持使用完整框架,与此相同的是 Mac,这简化了将此添加到应用程序中的过程。要将此添加到应用程序中,我建议将 .xcodeproj 项目文件拖动到您的应用程序项目中(就像在静态库目标中那样)。

对于您的应用程序,请转到其目标构建设置并选择“构建阶段”选项卡。在“目标依赖项”组下,将 GPUImageFramework 添加到 iOS(不是 GPUImage,它会构建静态库)或 GPUImage 添加到 Mac。在“链接二进制与库”部分,添加 GPUImage.framework。

这将导致 GPUImage 以框架的形式进行构建。在 Xcode 6 中,这也会以模块的形式进行构建,这可以使您在 Swift 项目中使用它。按照上述方式设置后,您只需要使用

import GPUImage

来导入它。

然后您需要添加一个新的“复制文件”构建阶段,将目标设置为“框架”,并将 GPUImage.framework 构建产品添加到其中。这将允许框架与您的应用程序捆绑(否则,您在执行时将看到神秘的“dyld: Library not loaded: @rpath/GPUImage.framework/GPUImage”错误)。

文档

文档由头文件注释生成,使用 appledoc。要生成文档,请切换到 Xcode 中的“文档”方案。您应确保“APPLEDOC_PATH”(一个用户定义的构建设置)指向 appledoc 二进制文件,该文件可在 Github 或通过 Homebrew 获取。它还将生成和安装一个 .docset 文件,您可以使用您喜欢的文档工具查看。

执行常见任务

筛选实时视频

要从iOS设备的相机中筛选实时视频,可以使用以下代码

GPUImageVideoCamera *videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack];
videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait;

GPUImageFilter *customFilter = [[GPUImageFilter alloc] initWithFragmentShaderFromFile:@"CustomShader"];
GPUImageView *filteredVideoView = [[GPUImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, viewWidth, viewHeight)];

// Add the view somewhere so it's visible

[videoCamera addTarget:customFilter];
[customFilter addTarget:filteredVideoView];

[videoCamera startCameraCapture];

此代码设置了一个源自iOS设备后置相机的视频源,使用预设尝试以640x480的分辨率捕获视频。该视频以横竖比为垂直模式捕获,需要将横屏设备上的视频帧旋转才能显示。然后使用来自文件CustomShader.fsh的代码创建一个自定义滤镜,作为来自相机的视频帧的目标。这些经过过滤的视频帧最终在屏幕上通过能够展示该管道结果的单例UIView子类显示。

可以通过设置GPUImageView的fillMode属性来更改其填充模式,以便如果源视频的纵横比与视口的纵横比不同,视频将拉伸、居中显示带黑色边框或缩放以填充。

对于混合滤镜和其他接受多个图像的滤镜,可以创建多个输出并将单个滤镜作为这两个输出的目标。输出作为目标添加的顺序将影响输入图像混合或处理的顺序。

此外,如果您想为录制视频启用麦克风音频捕获,需要将相机的audioEncodingTarget设置为您的电影编写器,如下所示

videoCamera.audioEncodingTarget = movieWriter;

捕获和过滤静态照片

要捕获并筛选静态照片,可以使用类似于筛选视频的过程。对于GPUImageVideoCamera,您将使用GPUImageStillCamera

stillCamera = [[GPUImageStillCamera alloc] init];
stillCamera.outputImageOrientation = UIInterfaceOrientationPortrait;

filter = [[GPUImageGammaFilter alloc] init];
[stillCamera addTarget:filter];
GPUImageView *filterView = (GPUImageView *)self.view;
[filter addTarget:filterView];

[stillCamera startCameraCapture];

这将为您提供静态相机的实时、过滤后的预览视频。请注意,此预览视频仅在iOS 4.3及以上版本提供,因此如果您想要此功能,可能需要将其设置为您的部署目标。

一旦想捕获一张照片,就可以使用以下回调块

[stillCamera capturePhotoProcessedUpToFilter:filter withCompletionHandler:^(UIImage *processedImage, NSError *error){
    NSData *dataForJPEGFile = UIImageJPEGRepresentation(processedImage, 0.8);

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];

    NSError *error2 = nil;
    if (![dataForJPEGFile writeToFile:[documentsDirectory stringByAppendingPathComponent:@"FilteredPhoto.jpg"] options:NSAtomicWrite error:&error2])
    {
        return;
    }
}];

上面的代码捕获了一般大小的照片,并使用与预览视图中相同的过滤链进行处理,然后将照片作为JPEG保存到应用的文档目录中。

请注意,由于纹理大小的限制,该框架目前无法处理宽度或高度超过2048像素的图像(iPhone 4S、iPad 2或Retina iPad之前的旧设备),这意味着iPhone 4等摄像头输出的静态照片可能会丢失。为此,正在实施Tile机制以解决这个问题。其他所有设备都应能够使用此方法捕获和过滤照片。

处理静态图像

处理静态图像并创建结果的方法有多种。首先,您可以通过创建静态图像源对象并手动创建一个过滤链来完成此操作。

UIImage *inputImage = [UIImage imageNamed:@"Lambeau.jpg"];

GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:inputImage];
GPUImageSepiaFilter *stillImageFilter = [[GPUImageSepiaFilter alloc] init];

[stillImageSource addTarget:stillImageFilter];
[stillImageFilter useNextFrameForImageCapture];
[stillImageSource processImage];

UIImage *currentFilteredVideoFrame = [stillImageFilter imageFromCurrentFramebuffer];

请注意,要从过滤中手动捕捉图像,您需要设置 -useNextFrameForImageCapture 以告诉过滤其您将在稍后从其捕捉。默认情况下,GPUImage会在过滤中重用帧缓冲区以节省内存,因此如果您需要保留一个过滤器的帧缓冲区以进行手动图像捕捉,则需要提前通知。

对于希望将过滤应用于图像的单个过滤,您可以简单地执行以下操作

GPUImageSepiaFilter *stillImageFilter2 = [[GPUImageSepiaFilter alloc] init];
UIImage *quickFilteredImage = [stillImageFilter2 imageByFilteringImage:inputImage];

编写自定义过滤

与iOS上的Core Image(截至iOS 5.0)相比,此框架的一个显著优点是能够编写自定义图像和视频处理过滤。这些过滤作为OpenGL ES 2.0片段着色器提供,用C-like OpenGL着色语言编写。

自定义过滤器的初始化代码如下

GPUImageFilter *customFilter = [[GPUImageFilter alloc] initWithFragmentShaderFromFile:@"CustomShader"];

其中使用的片段着色器扩展名为 .fsh。此外,您可以使用 -initWithFragmentShaderFromString: 初始化器将片段着色器以字符串的形式提供,如果您不想将片段着色器放入应用程序包中。

片段着色器使用OpenGL着色语言 (GLSL) 为在过滤阶段要渲染的每个像素进行计算。它使用一种类似于C的语言,具有针对2D和3D图形的特定添加。以下是一个示例的片段着色器,用于创建棕褐色滤镜

varying highp vec2 textureCoordinate;

uniform sampler2D inputImageTexture;

void main()
{
    lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);
    lowp vec4 outputColor;
    outputColor.r = (textureColor.r * 0.393) + (textureColor.g * 0.769) + (textureColor.b * 0.189);
    outputColor.g = (textureColor.r * 0.349) + (textureColor.g * 0.686) + (textureColor.b * 0.168);    
    outputColor.b = (textureColor.r * 0.272) + (textureColor.g * 0.534) + (textureColor.b * 0.131);
	outputColor.a = 1.0;

	gl_FragColor = outputColor;
}

对于能够在GPUImage框架中使用图像过滤,需要提供接收纹理坐标变量(当前在纹理中的坐标,标准化为1.0)和输入图像纹理统一(实际输入图像帧纹理)的前两行。

着色器的其余部分从传入的纹理中获取位于此位置的像素颜色,对其进行操作以产生棕褐色,并将该像素颜色写入以便在下一阶段的处理管道中使用。

在将片段着色器添加到Xcode项目时需要注意的一点是,Xcode认为它们是源代码文件。为了解决这个问题,您需要手动将您的着色器从“编译源”构建阶段移动到“复制包资源”中,以使着色器包含在您的应用程序包中。

影视滤波和转码

电影可以通过GPUImageMovie类加载到框架中,进行滤波,然后使用GPUImageMovieWriter写入。GPUImageMovieWriter足够快,可以从iPhone 4的相机实时记录视频(640x480),因此可以直接将经过滤波的视频源输入到它里面。目前,GPUImageMovieWriter足够快,可以在iPhone 4上实时记录720p视频(最高20 FPS),以及在iPhone 4S上记录720p和1080p视频(30 FPS),包括在新的iPad上。

以下是一个如何加载示例电影,通过像素化滤镜进行处理,然后以480 x 640 h.264电影的方式将其记录到磁盘的示例

movieFile = [[GPUImageMovie alloc] initWithURL:sampleURL];
pixellateFilter = [[GPUImagePixellateFilter alloc] init];

[movieFile addTarget:pixellateFilter];

NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.m4v"];
unlink([pathToMovie UTF8String]);
NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie];

movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(480.0, 640.0)];
[pixellateFilter addTarget:movieWriter];

movieWriter.shouldPassthroughAudio = YES;
movieFile.audioEncodingTarget = movieWriter;
[movieFile enableSynchronizedEncodingUsingMovieWriter:movieWriter];

[movieWriter startRecording];
[movieFile startProcessing];

一旦录制完成,您需要从滤波器链中移除电影录制器,并使用如下代码关闭录制:

[pixellateFilter removeTarget:movieWriter];
[movieWriter finishRecording];

电影完成之前是不可用的,因此如果在这一点之前中断,录制将丢失。

与OpenGL ES交互

通过使用GPUImage的GPUImageTextureOutput和GPUImageTextureInput类,GPUImage可以分别从OpenGL ES导出和导入纹理。这可以让您从OpenGL ES场景中录制电影,该场景渲染到包含纹理的帧缓冲对象,然后将视频或图像过滤并作为纹理输送到OpenGL ES,以便在场景中显示。

采取这种方法时要注意的是,在这些过程中使用的纹理必须在GPUImage的OpenGL ES上下文和任何其他上下文之间通过共享组或其他方式共享。

内置滤镜

目前有125个内置滤镜,分为以下类别:

颜色调整

  • GPUImageBrightnessFilter:调整图像的亮度

    • 亮度:调整后的亮度(-1.0 - 1.0,0.0为默认值)
  • GPUImageExposureFilter:调整图像的曝光度

    • 曝光度:调整后的曝光度(-10.0 - 10.0,0.0为默认值)
  • GPUImageContrastFilter:调整图像对比度

    • contrast:调整的对比度(0.0 - 4.0,默认值为1.0)
  • GPUImageSaturationFilter:调整图像的饱和度

    • saturation:应用于图像的饱和度或去饱和度程度(0.0 - 2.0,默认值为1.0)
  • GPUImageGammaFilter:调整图像的伽玛

    • gamma:应用的伽玛调整(0.0 - 3.0,默认值为1.0)
  • GPUImageLevelsFilter:类似Photoshop的级别调整。min、max、minOut和maxOut参数在[0, 1]范围内为浮点数。如果你有从Photoshop来的[0, 255]范围内的参数,你必须首先将它们转换为[0, 1]。gamma/mid参数是一个大于等于0的浮点数。这符合Photoshop中的值。如果你想要同时应用于RGB以及单个通道的颜色级别,你需要使用此过滤器两次 - 首先针对单个通道,然后针对所有通道。

  • GPUImageColorMatrixFilter:通过应用矩阵变换图像的颜色

    • colorMatrix:用于变换图像中每个颜色的4x4矩阵
    • intensity:新变换颜色替换每个像素原始颜色的程度
  • GPUImageRGBFilter:调整图像的个别RGB通道

    • red:按每个颜色通道乘以的归一化值。范围从0.0到无穷大,默认值为1.0。
    • green:
    • blue:
  • GPUImageHueFilter:调整图像的色调

    • hue:色调角度,单位为度。默认为90度
  • GPUImageVibranceFilter:调整图像的训练度

    • vibrance:应用于图像的训练度调整,使用0.0作为默认值,建议的最小/最大值分别为约-1.2和1.2。
  • GPUImageWhiteBalanceFilter:调整图像的白平衡。

    • temperature:调整图像的温度,以K为单位的温度。4000的值非常冷,而7000非常暖。默认值为5000。注意,在4000和5000之间的比例几乎与在5000和7000之间的比例在视觉上一样明显。
    • tint:调整图像的色彩偏好的值。-200的值非常绿,而200是非常粉红。默认值为0。
  • GPUImageToneCurveFilter:根据每个颜色通道的样条曲线调整图像的颜色

    • redControlPoints:
    • greenControlPoints:
    • blueControlPoints:
    • rgbCompositeControlPoints:色调曲线通过一系列控制点输入,这些点定义每个颜色组成部分的样条曲线,或对于复合体中的所有三个组成部分。它们存储为存储在NSArray中的NSValue-wrapped CGPoints,其中具有从0到1的归一化X和Y坐标。默认值为(0,0),(0.5,0.5),(1,1)。
  • GPUImageHighlightShadowFilter:调整图像的阴影和高光

    • shadows:增加以使阴影变亮,从0.0到1.0,默认值为0.0。
    • highlights:减少以使高光变暗,从1.0到0.0,默认值为1.0。
  • GPUImageHighlightShadowTintFilter:允许您使用颜色和强度独立着色图像的阴影和高光

    • shadowTintColor:阴影着色RGB颜色(GPUVector4)。默认值:{1.0f, 0.0f, 0.0f, 1.0f}(红色)。
    • highlightTintColor:高光着色RGB颜色(GPUVector4)。默认值:{0.0f, 0.0f, 1.0f, 1.0f}(蓝色)。
    • shadowTintIntensity:阴影着色强度,从0.0到1.0。默认:0.0
    • highlightTintIntensity:高光着色强度,从0.0到1.0,默认:0.0。
  • GPUImageLookupFilter:使用RGB颜色查找图重新映射图像中的颜色。首先,使用您喜欢的照片编辑应用程序过滤GPUImage/framework/Resources中的lookup.png。为了正常工作,每个像素的颜色不能依赖于其他像素(例如,模糊不会工作)。如果您需要一个更复杂的过滤器,您可以根据需要创建尽可能多的查找表。准备就绪后,使用新的lookup.png文件作为GPUImageLookupFilter的第二输入。

  • GPUImageAmatorkaFilter:基于Amatorka在Photoshop中的动作的照片滤镜:http://amatorka.deviantart.com/art/Amatorka-Action-2-121069631。如果您想使用这种效果,您必须将GPUImage Resources文件夹中的lookup_amatorka.png添加到您的应用程序包中。

  • GPUImageMissEtikateFilter:基于Miss Etikate在Photoshop中的动作的照片滤镜:http://miss-etikate.deviantart.com/art/Photoshop-Action-15-120151961。如果您想使用这种效果,您必须将GPUImage Resources文件夹中的lookup_miss_etikate.png添加到您的应用程序包中。

  • GPUImageSoftEleganceFilter:另一个基于查找的彩色重映射滤镜。如果您想使用这个效果,您必须将GPUImage Resources文件夹中的lookup_soft_elegance_1.png和lookup_soft_elegance_2.png添加到您的应用程序包中。

  • GPUImageSkinToneFilter:一种调整肤色的滤镜,会影响独特的浅肤色颜色范围,并相应地调整粉红色/绿色或粉红色/橙色范围。默认值针对浅色白人皮肤,但可以根据需要进行调整。

    • skinToneAdjust:调整肤色的大小。默认值:0.0,建议的最小/最大值:-0.3和0.3。
    • skinHue:要检测的肤色色调。默认:0.05(浅色白人至粉色皮肤)。
    • skinHueThreshold:肤色色调的差异量。默认:40.0。
    • maxHueShift:允许的最大色调偏移量。默认:0.25。
    • maxSaturationShift =最大饱和度移位量(当使用橙色时)。默认:0.4。
    • upperSkinToneColor = GPUImageSkinToneUpperColorGreenGPUImageSkinToneUpperColorOrange
  • GPUImageColorInvertFilter:反转图像中的颜色

  • GPUImageGrayscaleFilter:将图像转换为灰度(饱和度滤镜的简单实现,没有调整颜色贡献的能力)

  • GPUImageMonochromeFilter:将图像转换为基于每个像素亮度的单色版本

    • intensity:将特定颜色替换正常图像颜色的程度(0.0 - 1.0,默认1.0)
    • color:用作效果基础的背景颜色,默认为(0.6,0.45,0.3,1.0)。
  • GPUImageFalseColorFilter:使用图像的亮度在两个用户指定的颜色之间混合

    • firstColor:第1和第2个颜色分别指定替换dark和light图像区域的颜色。默认为(0.0,0.0,0.5)和(1.0,0.0,0.0)。
    • secondColor:
  • GPUImageHazeFilter:用于添加或去除雾(类似于UV滤镜)

    • distance:应用颜色的强度。默认值为0。最佳值介于-0.3和0.3之间。
    • slope:颜色变化量。默认值:0。最佳值介于-0.3和0.3之间。
  • GPUImageSepiaFilter:简单的棕褐色滤镜

    • intensity:棕褐色替换正常图像颜色的程度(0.0 - 1.0,默认值为1.0)
  • GPUImageOpacityFilter:调整传入图像的alpha通道

    • opacity:将此值乘以每个像素的传入alpha通道的值(0.0 - 1.0,默认值为1.0)
  • GPUImageSolidColorGenerator:输出具有纯红色的生成图像。您需要使用-forceProcessingAtSize定义图像大小

    • color:用于填充图像的4分量格式颜色。
  • GPUImageLuminanceThresholdFilter:亮度高于阈值的像素将显示为白色,亮度低于阈值的像素将显示为黑色

    • 阈值:亮度阈值,从0.0到1.0,默认为0.5。
  • GPUImageAdaptiveThresholdFilter:确定像素周围的局部亮度,如果像素亮度低于该局部亮度则将其设置为黑色,如果高于则设置为白色。这在选择不同光照条件下的文本时很有用。

    • blurRadiusInPixels:像素背景平均模糊半径的乘数,默认为4。
  • GPUImageAverageLuminanceThresholdFilter:该过滤器执行阈值操作,阈值会根据场景的平均亮度不断调整。

    • thresholdMultiplier:将平均亮度乘以的系数,以获得最终使用的阈值。默认为1.0。
  • GPUImageHistogramFilter:分析输入图像,并根据每种颜色值出现的频率创建输出直方图。此过滤器的输出是一个3像素高、256像素宽的图像,中间(垂直)像素包含对应各种颜色值出现频率的像素。每个颜色值占据256个宽度位置之一,从左边的0到右边的255。可以为单个颜色通道(kGPUImageHistogramRed、kGPUImageHistogramGreen、kGPUImageHistogramBlue)、图像亮度(kGPUImageHistogramLuminance)或同时为所有三个颜色通道生成此直方图(kGPUImageHistogramRGB)。

    • downsamplingFactor:不是对每个像素进行采样,而是指定图像样本的比例。默认为16,最小为1。这需要减少直方图饱和度,因为直方图只能记录每个颜色值256个像素,否则会溢出。
  • GPUImageHistogramGenerator:这是一个特殊的过滤器,主要打算与GPUImageHistogramFilter一起使用。它生成由GPUImageHistogramFilter生成的颜色直方图的输出表示,但它可以被重新用于显示其他类型的值。它接收一个图像并查看中间(垂直)像素。然后,它在输出纹理中分别以不同颜色的图表形式绘制RGB组件的数值。您可能需要强制设置此过滤器的尺寸,以便使其输出可见。

  • GPUImageAverageColor:处理输入图像并确定场景的平均颜色,通过平均图像中每个像素的RGBA组件来实现。使用减法过程在GPU上逐步下采样源图像,然后在CPU上进行简短的平均计算。该过滤器的输出无意义,但您需要设置colorAverageProcessingFinishedBlock属性到一个块,该块接收四个颜色组件和一个帧时间并对其进行处理。

  • GPUImageLuminosity:与GPUImageAverageColor类似,它将图像缩减为其平均亮度。需要设置luminosityProcessingFinishedBlock来处理此过滤器的输出,它仅返回一个亮度和帧时间。

  • GPUImageChromaKeyFilter:对于图像中的给定颜色,将透明度通道设置为0。这与GPUImageChromaKeyBlendFilter类似,只不过不混合第二个图像,而是将给定的颜色设置为透明。

    • thresholdSensitivity:匹配颜色与目标颜色需要有多接近才能被替换(默认为0.4)
    • smoothing:混合颜色匹配的平滑程度(默认为0.1)

图像处理

  • GPUImageTransformFilter:将任意2D或3D变换应用于图像

    • affineTransform:接收一个CGAffineTransform以在2D中对图像进行调整
    • transform3D:接收一个CATransform3D以在3D中操作图像
    • ignoreAspectRatio:默认情况下,保持变换后图像的宽高比,但可以将其设置为YES以使变换与宽高比无关
  • GPUImageCropFilter:将图像裁剪到特定区域,然后将该区域传递到滤镜的下一阶段

    • cropRegion:要裁剪的矩形区域,以0.0 - 1.0的坐标标准化。位置(0.0, 0.0)在图像的左上角。
  • GPUImageLanczosResamplingFilter:使用Lanczos重采样技术上采样或下采样图像,其质量明显优于标准的线性或三线性插值。简单使用-forceProcessingAtSize:来设置滤镜的目标输出分辨率,并对图像进行重采样以获得新大小。

  • GPUImageSharpenFilter:锐化图像

    • sharpness:要应用的锐化调整(-4.0 - 4.0,默认为0.0)
  • GPUImageUnsharpMaskFilter:应用锐化蒙版

    • blurRadiusInPixels:底层高斯模糊的模糊半径。默认为4.0。
    • intensity:从0.0开始增加的锐化强度,默认为1.0
  • GPUImageGaussianBlurFilter:一个硬件优化的,可变半径的高斯模糊

    • texelSpacingMultiplier:纹理像素之间间隔的乘数,从0.0开始向上,默认为1.0。调整此值可能会略微增加模糊强度,但也可能导致结果中出现伪影。强烈建议首先使用其他参数。
    • blurRadiusInPixels:用于模糊的半径(以像素为单位),默认为2.0。这调整高斯分布函数中的sigma变量。
    • blurRadiusAsFractionOfImageWidth:
    • blurRadiusAsFractionOfImageHeight:设置这些属性将允许模糊半径随图像大小缩放
    • blurPasses:依次模糊传入图像的次数。次数越多,滤镜越慢。
  • GPUImageBoxBlurFilter:一个硬件优化的,可变半径的矩形模糊

    • texelSpacingMultiplier:纹理像素之间间隔的乘数,从0.0开始向上,默认为1.0。调整此值可能会略微增加模糊强度,但也可能导致结果中出现伪影。强烈建议首先使用其他参数。
    • blurRadiusInPixels:用于模糊的半径(以像素为单位),默认为2.0。这调整高斯分布函数中的sigma变量。
    • blurRadiusAsFractionOfImageWidth:
    • blurRadiusAsFractionOfImageHeight:设置这些属性将允许模糊半径随图像大小缩放
    • blurPasses:依次模糊传入图像的次数。次数越多,滤镜越慢。
  • GPUImageSingleComponentGaussianBlurFilter:GPUImageGaussianBlurFilter的修改版,仅对红色组件起作用

    • texelSpacingMultiplier:纹理像素之间间隔的乘数,从0.0开始向上,默认为1.0。调整此值可能会略微增加模糊强度,但也可能导致结果中出现伪影。强烈建议首先使用其他参数。
    • blurRadiusInPixels:用于模糊的半径(以像素为单位),默认为2.0。这调整高斯分布函数中的sigma变量。
    • blurRadiusAsFractionOfImageWidth:
    • blurRadiusAsFractionOfImageHeight:设置这些属性将允许模糊半径随图像大小缩放
    • blurPasses:依次模糊传入图像的次数。次数越多,滤镜越慢。
  • GPUImageGaussianSelectiveBlurFilter:高斯模糊,在圆形区域内保持焦点

    • blurRadiusInPixels:用于模糊的半径(以像素为单位),默认为5.0。这调整高斯分布函数中的sigma变量。
    • excludeCircleRadius:要排除模糊的圆形区域的半径
    • excludeCirclePoint:要排除模糊的圆形区域的中心
    • excludeBlurSize:被模糊区域和清晰圆圈之间的区域大小
    • aspectRatio:图像的宽高比,用于调整焦点区域的圆形度。默认与此值匹配图像的宽高比,但可以覆盖此值。
  • GPUImageGaussianBlurPositionFilter:GPUImageGaussianSelectiveBlurFilter的反转,仅在特定圆内应用模糊

    • blurSize:模糊大小的乘数,从0.0开始向上,默认为1.0
    • blurCenter:模糊中心,默认为0.5,0.5
    • blurRadius:模糊半径,默认为1.0
  • GPUImageiOSBlurFilter:尝试在类似于控制中心的区域复制iOS 7中使用过的背景模糊效果。

    • blurRadiusInPixels:用于模糊的像素半径,默认为12.0。这会调整高斯分布函数中的sigma变量。
    • saturation:饱和度从0.0(完全未饱和)到2.0(最大饱和度),正常级别为0.8。
    • downsampling:降采样程度,然后上采样输入图像以最小化高斯模糊中的计算,默认为4.0。
  • GPUImageMedianFilter:在3x3区域内取三个颜色分量的中值。

  • GPUImageBilateralFilter:双边模糊,尝试模糊相似颜色值同时保留尖锐的边缘。

    • texelSpacingMultiplier:texel读取间隔的乘数,范围从0.0开始,默认为4.0。
    • distanceNormalizationFactor:中心颜色与样本颜色之间距离的正常化因子,默认为8.0。
  • GPUImageTiltShiftFilter:模拟倾斜移位镜头效果。

    • blurRadiusInPixels:底层模糊的半径(以像素为单位)。默认为7.0。
    • topFocusLevel:图像中焦点区域顶部的规范化位置,此值应小于bottomFocusLevel,默认为0.4。
    • bottomFocusLevel:图像中焦点区域底部的规范化位置,此值应大于topFocusLevel,默认为0.6。
    • focusFallOffRate:图像在焦点区域之外变得模糊的速度,默认为0.2。
  • GPUImage3x3ConvolutionFilter:使用3x3卷积核对图像进行操作。

    • convolutionKernel:卷积核是一个3x3的值矩阵,用于应用到像素及其8个相邻像素。该矩阵在行主顺序中指定,其中最左上角的像素是1.1和最右下角的3.3。如果矩阵中的值不等于1.0,则图像可能会变亮或变暗。
  • GPUImageSobelEdgeDetectionFilter:Sobel边缘检测,以白色突出边缘。

    • texelWidth:
    • texelHeight:这些参数影响检测到的边缘的可见性。
    • edgeStrength:调整滤波器的动态范围。较高的值会导致更强烈的边缘,但也可能导致强度颜色空间的饱和。默认为1.0。
  • GPUImagePrewittEdgeDetectionFilter:Prewitt边缘检测,以白色突出边缘。

    • texelWidth:
    • texelHeight:这些参数影响检测到的边缘的可见性。
    • edgeStrength:调整滤波器的动态范围。较高的值会导致更强烈的边缘,但也可能导致强度颜色空间的饱和。默认为1.0。
  • GPUImageThresholdEdgeDetectionFilter:执行Sobel边缘检测,但使用阈值而不是提供渐变强度值。

    • texelWidth:
    • texelHeight:这些参数影响检测到的边缘的可见性。
    • edgeStrength:调整滤波器的动态范围。较高的值会导致更强烈的边缘,但也可能导致强度颜色空间的饱和。默认为1.0。
    • threshold:任何高于此阈值的边缘将被黑色,而任何低于此阈值的边缘将被白色。范围从0.0到1.0,默认值为0.8。
  • GPUImageCannyEdgeDetectionFilter:此使用完整的Canny过程突出显示一像素宽的边缘。

    • texelWidth:
    • texelHeight:这些参数影响检测到的边缘的可见性。
    • blurRadiusInPixels:高斯模糊的底层模糊半径。默认为2.0。
    • blurTexelSpacingMultiplier:底层模糊的texel间隔乘数。默认为1.0。
    • upperThreshold:任何梯度幅度高于此阈值的边缘将通过并显示在最终结果中。默认为0.4。
    • lowerThreshold:任何梯度幅度低于此阈值的边缘将失败并从最终结果中移除。默认为0.1。
  • GPUImageHarrisCornerDetectionFilter:在输入图像上运行Harris角点检测算法,并生成一个以白色像素显示角点并其余部分为黑色的图像。可以设置cornersDetectedBlock,你将在这个回调中获得一个角点列表(在归一化的0..1 X,Y坐标内),你可以根据需要在该回调中执行任何额外的操作。

    • blurRadiusInPixels:底层高斯模糊的半径。默认为2.0。
    • sensitivity:应用于调整滤波器中生成的边缘图的动态范围的内部缩放因子。默认为5.0。
    • threshold:将点检测为角点的阈值。这可以根据大小、光照条件和iOS设备相机类型而有很大差异,所以可能需要一些实验才能 adapted for your specific case。默认为0.20。
  • GPUImageNobleCornerDetectionFilter:运行Noble变体的Harris角点检测器。它具有上述Harris检测器的描述行为。

    • blurRadiusInPixels:底层高斯模糊的半径。默认为2.0。
    • sensitivity:应用于调整滤波器中生成的边缘图的动态范围的内部缩放因子。默认为5.0。
    • 阈值:点被检测为角点的阈值。这可能会因尺寸、光照条件和iOS设备摄像头类型而显著变化,因此可能需要一些实验来找到适合您情况的方法。默认为0.2。
  • GPUImageShiTomasiCornerDetectionFilter:运行Shi-Tomasi特征检测器。它具有上述Harris检测器的描述行为。

    • blurRadiusInPixels:底层高斯模糊的半径。默认为2.0。
    • 灵敏度:用于调整过滤器生成的角点动态范围的内部缩放因子。默认为1.5。
    • 阈值:点被检测为角点的阈值。这可能会因尺寸、光照条件和iOS设备摄像头类型而显著变化,因此可能需要一些实验来找到适合您情况的方法。默认为0.2。
  • GPUImageNonMaximumSuppressionFilter:目前只作为Harris角点检测器的一部分使用,它将在每个像素周围采样一个1像素的方块,并确定中心像素的红色通道是否是该区域的最大值。如果是,它将保留。如果不是,它将所有颜色组件都设置为0。

  • GPUImageXYDerivativeFilter:是Harris角点检测器内部组件,它计算此像素左右像素的平方差,以及上方和下方像素的平方差,并计算这两个差值的乘积。

  • GPUImageCrosshairGenerator:在图像上绘制一系列十字准线,通常用于识别机器视觉特征。它不输入标准图像,而是使用其-rendereCrosshairsFromArray:count:方法中的点序列,该方法执行实际的绘制操作。您可能需要强制此过滤器以特定输出大小进行渲染。

    • 十字准线宽度:要在屏幕上绘制的十字准线的像素宽度。
  • GPUImageDilationFilter:执行图像膨胀操作,在该操作中,矩形邻域中红色通道的最大强度用作此像素的强度。方形区域采样半径在初始化时指定,范围为1-4像素。这适用于灰度图像,并扩展明亮区域。

  • GPUImageRGBDilationFilter:这与GPUImageDilationFilter相同,除了它作用于所有颜色通道,而不仅仅是红色通道。

  • GPUImageErosionFilter:执行图像腐蚀操作,在该操作中,矩形邻域中红色通道的最小强度用作此像素的强度。方形区域采样半径在初始化时指定,范围为1-4像素。这适用于灰度图像,并扩展黑暗区域。

  • GPUImageRGBErosionFilter:这与GPUImageErosionFilter相同,除了它作用于所有颜色通道,而不仅仅是红色通道。

  • GPUImageOpeningFilter:在图像的红色通道上执行腐蚀,然后以相同半径进行膨胀。半径在初始化时设置,范围为1-4像素。该过滤器去除较小的明亮区域。

  • GPUImageRGBOpeningFilter:这与GPUImageOpeningFilter相同,除了它作用于所有颜色通道,而不仅仅是红色通道。

  • GPUImageClosingFilter:在图像的红色通道上执行膨胀,然后以相同半径进行腐蚀。半径在初始化时设置,范围为1-4像素。该过滤器去除较小的黑暗区域。

  • GPUImageRGBClosingFilter:这与GPUImageClosingFilter相同,除了它作用于所有颜色通道,而不仅仅是红色通道。

  • GPUImageLocalBinaryPatternFilter:将周围8个像素的红色通道强度与中心像素的强度进行比较,并将比较结果编码为位字符串,该字符串成为此像素的强度。最不重要的位是右上角比较,按逆时针方向结束于最显著的位。

  • GPUImageLowPassFilter:将该滤波器应用于输入的视频帧。这基本上是将之前累积帧的加权移动平均与当前帧累积在一起。可用于降噪视频、添加运动模糊或创建高通滤波器。

    • filterStrength:该参数控制先前累积帧与当前帧混合的程度。范围从0.0到1.0,默认值为0.5。
  • GPUImageHighPassFilter:将该高通滤波器应用于输入的视频帧。这是低通滤波器的逆运算,显示当前帧与先前加权移动平均帧之间的差异。这对于运动检测非常有用。

    • filterStrength:该参数控制先前累积帧混合后从当前帧中减去到何种程度。范围从0.0到1.0,默认值为0.5。
  • GPUImageMotionDetector:这是一个基于高通滤波器的高运动检测器。您设置了运动检测块,在每帧输入时,它会给出场景中检测到的任何运动的质心(在标准化的X,Y坐标中),以及场景的运动强度。

    • lowPassFilterStrength:该参数控制后台低通滤波器的强度,用于确定输入帧的比较基准。范围为0.0到1.0,默认值为0.5。
  • GPUImageHoughTransformLineDetector:使用霍夫变换到平行空间来检测图像中的线条。这种方法完全基于Brno工业大学Graph@FIT研究小组开发的PC线条过程,并在他们的出版物中描述:M. Dubská, J. Havel, 和 A. Herout。使用并行坐标和OpenGL实时检测线条。SCCG 2011会议论文,Bratislava,SK,第7页(http://medusa.fit.vutbr.cz/public/data/papers/2011-SCCG-Dubska-Real-Time-Line-Detection-Using-PC-and-OpenGL.pdf)和M. Dubská, J. Havel, 和 A. Herout。PClines - 使用并行坐标进行线条检测。2011年计算机视觉和模式识别会议(CVPR),第1489-1494页(http://medusa.fit.vutbr.cz/public/data/papers/2011-CVPR-Dubska-PClines.pdf)。

    • edgeThreshold:一个阈值值,用来判断一个点是否属于边缘线,用于确定线条。默认值为0.9。
    • lineDetectionThreshold:一个阈值,用于在并行空间中将局部极大值检测为属于线条。默认值为0.20。
    • linesDetectedBlock:当检测到线条时调用此块,通常在每一帧处理时调用。一个包含在m,b配对(y=mx+b)中标准化的斜率和截距的C数组被传递,以及检测到的线条数量和视频帧的当前时间戳。
  • GPUImageLineGenerator:一个辅助类,用于生成可以叠加到场景中的线条。这些线的颜色可以使用-setLineColorRed:green:blue进行调整。

    • lineWidth:线的宽度,以像素为单位,默认值为1.0。
  • GPUImageMotionBlurFilter:将方向性运动模糊应用于图像。

    • blurSize:模糊大小的乘数,从0.0开始,默认值为1.0。
    • blurAngle:模糊的角方向,以度为单位。默认为0度。
  • GPUImageZoomBlurFilter:将方向性运动模糊应用于图像。

    • blurSize:模糊大小的乘数,从0.0开始,默认值为1.0。
    • blurCenter:模糊的标准化中心。(默认为(0.5,0.5)。

混合模式

  • GPUImageChromaKeyBlendFilter:选择性地使用第二张图像替换第一张图像中的颜色

    • thresholdSensitivity:匹配颜色与目标颜色需要有多接近才能被替换(默认为0.4)
    • smoothing:混合颜色匹配的平滑程度(默认为0.1)
  • GPUImageDissolveBlendFilter:应用两张图像的溶解混合

    • mix:第二张图像覆盖第一张图像的程度(0.0 - 1.0,默认为0.5)
  • GPUImageMultiplyBlendFilter:应用两张图像的乘法混合

  • GPUImageAddBlendFilter:应用两张图像的加法混合

  • GPUImageSubtractBlendFilter:应用两张图像的减法混合

  • GPUImageDivideBlendFilter:应用两张图像的除法混合

  • GPUImageOverlayBlendFilter:应用两张图像的叠加混合

  • GPUImageDarkenBlendFilter:通过取两张图像中每个颜色分量的最小值来混合两张图像

  • GPUImageLightenBlendFilter:通过取两张图像中每个颜色分量的最大值来混合两张图像

  • GPUImageColorBurnBlendFilter:应用两张图像的颜色燃烧混合

  • GPUImageColorDodgeBlendFilter:应用两张图像的颜色漂白混合

  • GPUImageScreenBlendFilter:应用两张图像的屏幕混合

  • GPUImageExclusionBlendFilter:应用两张图像的排除混合

  • GPUImageDifferenceBlendFilter:应用两张图像的差值混合

  • GPUImageHardLightBlendFilter:应用两张图像的硬光混合

  • GPUImageSoftLightBlendFilter:应用两张图像的柔光混合

  • GPUImageAlphaBlendFilter:基于第二图像的alpha通道混合第二张图像到第一张图像上

    • mix:第二张图像覆盖第一张图像的程度(0.0 - 1.0,默认为1.0)
  • GPUImageSourceOverBlendFilter:应用两张图像的源上的混合

  • GPUImageColorBurnBlendFilter:应用两张图像的颜色燃烧混合

  • GPUImageColorDodgeBlendFilter:应用两张图像的颜色漂白混合

  • GPUImageNormalBlendFilter:应用两张图像的正常混合

  • GPUImageColorBlendFilter:应用两张图像的颜色混合

  • GPUImageHueBlendFilter:应用两张图像的色调混合

  • GPUImageSaturationBlendFilter:应用两张图像的饱和度混合

  • GPUImageLuminosityBlendFilter:应用两张图像的亮度混合

  • GPUImageLinearBurnBlendFilter:应用两张图像的线性燃烧混合

  • GPUImagePoissonBlendFilter:应用两张图像的Poisson混合

    • mix:混合范围从0.0(只有图像1)到1.0(只有图像2渐变),默认为1.0
    • numIterations:传播渐变的次数。如果想接近收敛,可以将这个值调至100甚至1000。是的,这将会很慢。
  • GPUImageMaskFilter:使用另一张图像来掩蔽一张图像

视觉效果

  • GPUImagePixellateFilter:对一个图像或视频应用像素化效果

    • fractionalWidthOfAPixel:像素大小作为图像宽度和高度的比例(0.0 - 1.0,默认0.05)
  • GPUImagePolarPixellateFilter:根据极坐标而不是笛卡尔坐标应用像素化效果

    • center:应用像素化的中心,默认为(0.5,0.5)
    • 像素尺寸:像素大小的分数,分为宽度和高度组件。默认值是(0.05, 0.05)
  • GPUImagePolkaDotFilter:将图像分割成规则网格中的彩色点

    • 像素的宽度分数:点的大小,以图像的宽度和高度为分数(0.0 - 1.0,默认值 0.05)
    • 点缩放:每个网格空间中点占用的比例,从0.0到1.0,默认值0.9。
  • GPUImageHalftoneFilter:将图像应用于半色调效果,如新闻印刷

    • 像素的宽度分数:半色调点的大小,以图像的宽度和高度为分数(0.0 - 1.0,默认值 0.05)
  • GPUImageCrosshatchFilter:将图像转换为黑白交叉纹理图案

    • 交叉纹理间隔:用于交叉纹理间隔的图像的宽度分数。默认值是0.03。
    • 线宽:交叉纹理线的相对宽度。默认值是0.003。
  • GPUImageSketchFilter:将视频转换为像草图一样的效果。这只是Sobel边缘检测滤波器,但颜色被反转。

    • texelWidth:
    • texelHeight:这些参数影响检测到的边缘的可见性。
    • edgeStrength:调整滤波器的动态范围。较高的值会导致更强烈的边缘,但也可能导致强度颜色空间的饱和。默认为1.0。
  • GPUImageThresholdSketchFilter:与草图滤镜相同,只是边缘被阈值而不是灰度化

    • texelWidth:
    • texelHeight:这些参数影响检测到的边缘的可见性。
    • edgeStrength:调整滤波器的动态范围。较高的值会导致更强烈的边缘,但也可能导致强度颜色空间的饱和。默认为1.0。
    • threshold:任何高于此阈值的边缘将被黑色,而任何低于此阈值的边缘将被白色。范围从0.0到1.0,默认值为0.8。
  • GPUImageToonFilter:使用Sobel边缘检测在对象周围放置黑色边缘,然后将图像中出现的颜色量化,以给图像带来卡通般的质感。

    • texelWidth:
    • texelHeight:这些参数影响检测到的边缘的可见性。
    • 阈值:边缘检测的灵敏度,数值越低越敏感。范围从0.0到1.0,默认值0.2。
    • 量化级别:在最终图像中表示的颜色级别数量。默认是10.0。
  • GPUImageSmoothToonFilter:使用了类似于GPUImageToonFilter的过程,但它使用高斯模糊来平滑噪声, precedes the toon effect。

    • texelWidth:
    • texelHeight:这些参数影响检测到的边缘的可见性。
    • blurRadiusInPixels:底层高斯模糊的半径。默认为2.0。
    • 阈值:边缘检测的灵敏度,数值越低越敏感。范围从0.0到1.0,默认值0.2。
    • 量化级别:在最终图像中表示的颜色级别数量。默认是10.0。
  • GPUImageEmbossFilter:在图像上应用浮雕效果

    • 强度:浮雕效果的强度,从0.0到4.0,正常级别为1.0。
  • GPUImagePosterizeFilter:将颜色动态范围减少到指定的步数,导致图像具有卡通般的简单阴影。

    • 颜色级别:减少图像空间的颜色级别数量。范围从1到256,默认为10。
  • GPUImageSwirlFilter:在图像上创建螺旋扭曲

    • 半径:应用于扭曲的中心到边界的半径,默认值为0.5。
    • 中心:图像中心(以0 - 1.0的归一化坐标)为旋转中心,默认值为(0.5, 0.5)。
    • 角度:应用于图像的扭曲程度,默认值为1.0。
  • GPUImageBulgeDistortionFilter:在图像上创建膨胀扭曲

    • 半径:应用于扭曲的中心到边界的半径,默认值为0.25。
    • 中心:图像中心(以0 - 1.0的归一化坐标)为扭曲的中心,默认值为(0.5, 0.5)。
    • 缩放:应用的扭曲程度,从-1.0到1.0,默认值为0.5。
  • GPUImagePinchDistortionFilter:创建图像的挤压扭曲

    • 半径:应用于扭曲的中心到边界的半径,默认值为1.0。
    • 中心:图像中心(以0 - 1.0的归一化坐标)为扭曲的中心,默认值为(0.5, 0.5)。
    • 缩放:应用的扭曲程度,从-2.0到2.0,默认值为1.0。
  • GPUImageStretchDistortionFilter:创建图像的拉伸扭曲

    • 中心:图像中心(以0 - 1.0的归一化坐标)为扭曲的中心,默认值为(0.5, 0.5)。
  • GPUImageSphereRefractionFilter:模拟通过玻璃球体的折射

    • 中心:应用扭曲的中心,默认值为(0.5, 0.5)。
    • 半径:扭曲的半径,范围从0.0到1.0,默认值为0.25。
    • 折射率:球体的折射率,默认值为0.71
  • GPUImageGlassSphereFilter:类似于GPUImageSphereRefractionFilter,但图像不会被反转,玻璃边缘有一些霜化效果

    • 中心:应用扭曲的中心,默认值为(0.5, 0.5)。
    • 半径:扭曲的半径,范围从0.0到1.0,默认值为0.25。
    • 折射率:球体的折射率,默认值为0.71
  • GPUImageVignetteFilter:执行晕影效果,使图像边缘逐渐变淡

    • vignetteCenter:晕影的tex坐标(CGPoint)中心,默认为0.5, 0.5
    • vignetteColor:用于晕影的颜色(GPUVector3),默认为黑色
    • vignetteStart:从中心开始的晕影效果距离,归一化,默认为0.5
    • vignetteEnd:从中心结束的晕影效果距离,归一化,默认为0.75
  • GPUImageKuwaharaFilter:基于Kyprianidis等人的工作,其发表在GPU Pro系列中的“Anisotropic Kuwahara Filtering on the GPU”一文,进行Kuwahara图像抽象。这会产生一种油画风格的图像,但它的计算成本极高,所以在一个iPad 2上渲染一帧可能需要几秒钟。这可能最好用于静态图像。

    • radius:指定从中心像素向外测试的像素数,默认为4。较高的值会创建一个更抽象的图像,但会导致处理时间大增。
  • GPUImageKuwaharaRadius3Filter:Kuwahara滤波器的改进版本,优化为仅在三像素范围内工作

  • GPUImagePerlinNoiseFilter:生成充满Perlin噪声的图像

    • 颜色起始点:
    • 彩色结束点:生成的噪声的颜色范围
    • scale:生成的噪声的缩放比例
  • GPUImageCGAColorspaceFilter:模拟CGA监视器的色域

  • GPUImageMosaicFilter:此滤波器接受输入的瓦片集,瓦片必须按照亮度递增。它查看输入图像,并根据该瓦片的亮度用输入瓦片替换每个显示瓦片。这个想法是想模仿在其他应用程序中看到的ASCII视频滤镜,但瓦片集可以是任何东西。

    • 输入瓦片大小:
    • 瓦片数量:
    • 显示瓦片大小:
    • 着色:
  • GPUImageJFAVoronoiFilter:生成Voronoi图,供后期使用。

    • 像素大小:单个元素的大小
  • GPUImageVoronoiConsumerFilter:接受Voronoi图,并使用它来过滤传入的图像。

    • 像素大小:单个元素的大小

您还可以使用描述如上所述的类似的OpenGL着色语言轻松编写自己的自定义过滤程序。

示例应用程序

框架源代码中包含几个示例应用程序。大多数都兼容iPhone和iPad类设备。它们试图展示框架的各个方面,应作为开发框架时的最佳API示例。这包括

SimpleImageFilter

在应用程序启动时,将加载捆绑的JPEG图像,对它应用过滤器,并将结果渲染到屏幕上。此外,此示例还展示了两种输入图像,过滤它们并将其保存到磁盘的方法。

SimpleVideoFilter

在实时视频流上应用马赛克滤镜,并提供一个UISlider控件,可调节实时视频中的像素大小。

SimpleVideoFileFilter

从磁盘加载电影文件,对其应用锐化蒙版滤镜,并将过滤后的结果重新编码为另一个电影文件。

MultiViewFilterExample

从单路相机信号中,通过实时滤镜创建了四个视图。其中一个是原始相机视频,一个是预设的棕褐色调,另外两个是根据着色器程序自定义的滤镜。

FilterShowcase

展示了GPUImage提供的所有滤镜。

BenchmarkSuite

用于测试整个框架的性能,通过对其进行与CPU密集型操作和Core Image的测试。涉及静态图像和视频的基准测试将在三者上运行,结果在应用程序中显示。

CubeExample

这展示了GPUImage与OpenGL ES渲染交互的能力。从摄像头捕获帧,将这些帧应用上深棕色调滤镜,然后将它们输入到一个纹理中,可以旋转的立方体的面上会应用这个纹理。这个立方体随后会被渲染到一个背后带有纹理的帧缓冲对象中,然后这个纹理被送回GPUImage,在渲染到屏幕前会对它应用像素化滤镜。

换句话说,这个应用的处理路径是:相机 -> 深棕色调滤镜 -> 立方体 -> 像素化滤镜 -> 显示。

颜色物体跟踪

这是我的颜色跟踪示例的一个版本,从http://www.sunsetlakesoftware.com/2010/10/22/gpu-accelerated-video-processing-mac-and-ios迁移到使用GPUImage,这个应用程序使用场景中的颜色来从实时摄像头流中跟踪物体。您可以在以下四个视图之间切换:原始摄像头流、带有匹配颜色阈值的像素为白色的摄像头流、经过处理的视频,其中位置被编码为通过阈值测试的像素内的颜色,以及最后带有跟踪选中颜色的点的实时视频流。轻击屏幕会将要跟踪的颜色改变为手指下的像素颜色。在屏幕上轻击和拖动会使颜色阈值更宽或更严。这在第二个颜色阈值视图中最为明显。

目前,最后一步中颜色平均的处理全部在CPU上完成,因此这部分非常慢。