GPUImage 0.1.7

GPUImage 0.1.7

测试已测试
Lang语言 Obj-CObjective C
许可证 BSD
发布最新发布2015 年 9 月

Ernesto RiveraErnesto RiveraDima Vartanian 维护。



GPUImage 0.1.7

  • Brad Larson

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 上 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密集型程序中更快。然而,它隐藏了与OpenGL ES API交互的复杂性,通过简化的Objective-C接口来实现。此接口允许您定义图像和视频的输入源,将过滤器以链的形式附加,并将处理后的图像或视频发送到屏幕、UIImage或磁盘上的电影。

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

链中的过滤器和后续元素遵守GPUImageInput协议,这使它们可以从链中前一个链接提供的或处理过的纹理中获取信息,并对其进行处理。链中进一步的对象被视为目标,可以通过向单个输出或过滤器添加多个目标来分支处理。

例如,一个从摄像头接收实时视频的应用程序,将该视频转换为棕色色调,然后在屏幕上显示视频,将设置一个如下所示的链

GPUImageVideoCamera -> GPUImageSepiaFilter -> GPUImageView

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

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

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

GPUImage需要在您的应用程序中链接几个其他框架,因此您需要在应用程序目标中添加以下内容作为链接库

  • CoreMedia
  • CoreVideo
  • OpenGLES
  • AVFoundation
  • QuartzCore

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

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

#import "GPUImage.h"

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

此外,如果您需要将此部署到iOS 4.x,当前版本的Xcode(4.3)要求您在最终应用中对Core Video框架进行弱链接,否则在创建用于上传到App Store或进行临时分布的存档时,您将看到崩溃信息“Symbol not found: _CVOpenGLESTextureCacheCreate”。要做到这一点,请转到项目“构建阶段”标签,展开“链接二进制与库”组,并在列表中找到CoreVideo.framework。将列表最右侧的设置从“必需”更改为“可选”。

此外,这是一个支持自动引用计数的框架,因此如果您想在一个针对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项目文件拖放到应用程序项目中(就像在静态库目标中一样)。

对于您的应用程序,请转到其目标的构建设置并选择“构建阶段”标签。在“目标依赖”分组下,在iOS(而非GPUImage,它构建静态库)上添加GPUImageFramework或在Mac上添加GPUImage。在“链接二进制与库”部分,添加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中获取代码的自定义过滤器设置为摄像头视频帧的目标。最后,通过可以呈现由该管道生成的过滤OpenGL ES纹理的UIView子类,这些过滤后的视频帧最终显示在屏幕上。

可以通过设置GPUImageView的fillMode属性来更改GPUImageView的填充模式,这样如果源视频的纵横比与视图不同,视频将被拉伸、居中添加黑条或缩放以填充。

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

此外,如果您希望启用用于录制电影的麦克风音频捕获,则需要将摄像头的audioEncodingTarget设置为您的电影写入器,如下所示

videoCamera.audioEncodingTarget = movieWriter;

捕获和过滤静态照片

要捕获和过滤静态照片,可以使用与过滤视频类似的过程。您使用的是GPUImageStillCamera而不是GPUImageVideoCamera。

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格式保存在应用的文档目录中。

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

处理静态图像

有几种方法可以处理静态图像并创建结果。第一种方法是创建静态图像源对象并手动创建过滤器链。

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上iOS Core Image(截至iOS 5.0)相比,此框架的一个重要优势是能够编写自己的自定义图像和视频处理过滤器。这些过滤器作为OpenGL ES 2.0片段着色器提供,使用类似C的OpenGL着色语言编写。

自定义过滤器以类似以下代码的方式初始化:

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

片段着色器使用的扩展名是 .fsh。此外,您可以使用 `-initWithFragmentShaderFromString:` 初始化器以字符串的形式提供片段着色器,如果您不愿意在应用程序包中发货您的片段着色器。

片段着色器在每个要在该过滤阶段渲染的像素上进行计算。它们使用 OpenGL 着色语言(GLSL),这是一种类似于 C 的语言,增加了针对 2-D 和 3-D 图形的特定功能。以下是一个片段着色器的示例,它是一个棕褐色滤镜

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 上可以使能高达 20 FPS 的实时记录 720p 视频,并且在 iPhone 4S(以及新 iPad)上以 30 FPS recording 720p 和 1080p 视频。

以下是一个加载示例电影,将其通过像素化滤镜传递,然后将结果记录到磁盘作为 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 类分别导出和导入 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:调整图像对比度

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

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

    • 伽玛:应用的伽玛调整(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:通过应用矩阵转换图像的颜色

    • 颜色矩阵:用于转换图像中每个颜色的4x4矩阵
    • 强度:新转换颜色替换每个像素原始颜色的程度
  • GPUImageRGBFilter:调整图像的单独RGB通道

    • 红色:通过每个颜色通道乘以的归一化值。范围是从0.0以上,默认值为1.0。
    • 绿色:
    • 蓝色:
  • GPUImageHueFilter:调整图像的色调

    • 色调:色调角度,默认为90度
  • GPUImageToneCurveFilter:基于每个颜色通道的样条曲线调整图像的颜色

    • redControlPoints:
    • greenControlPoints:
    • blueControlPoints:
    • rgbCompositeControlPoints:色调曲线接受一系列定义每个颜色组件的样条曲线的控制点,或者对复合中的所有三个。这些存储为包含从0 - 1的归一化X和Y坐标的NSValue-wrapped CGPoints的NSArray中。默认值为(0,0),(0.5,0.5),(1,1)。
  • GPUImageHighlightShadowFilter:调整图像的阴影和亮部

    • 阴影:增加以使阴影变亮,从0.0到1.0,默认为0.0。
    • 亮部:减少以使亮部变暗,从0.0到1.0,默认为1.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添加到您的应用程序包中。

  • GPUImageColorInvertFilter:反转图像中的颜色

  • GPUImageGrayscaleFilter:将图像转换为灰度(饱和度滤镜的一种略微快的实现,没有改变颜色贡献的能力)

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

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

    • 第一种颜色:第一种和第二种颜色分别指定图像的暗部和亮部用什么颜色替代。默认分别为(0.0, 0.0, 0.5)和(1.0, 0.0, 0.0)。
    • 第二种颜色:
  • GPUImageHazeFilter:用于添加或去除雾霾(类似于UV滤镜)。

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

    • 强度:棕褐色色调替代正常图像颜色的程度(0.0 - 1.0,默认为1.0)。
  • GPUImageOpacityFilter:调整输入图像的alpha通道。

    • 不透明度:每个像素的输入alpha通道需要乘以的值(0.0 - 1.0,默认为1.0)。
  • GPUImageSolidColorGenerator:输出具有纯色的生成图像。您需要使用-forceProcessingAtSize定义图像尺寸。

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

    • 阈值:亮度阈值,范围从0.0到1.0,默认值为0.5。
  • GPUImageAdaptiveThresholdFilter:确定像素周围的局部亮度,然后如果像素亮度低于该局部亮度则将其变为黑色,如果高于则变为白色。这在提取在各种光照条件下下的文本时很有用。

    • 模糊半径像素:背景平均模糊半径的像素乘数,默认为4。
  • GPUImageAverageLuminanceThresholdFilter:对场景的平均亮度进行连续调整,来实现阈值操作。

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

    • 下采样因子:不是对每个像素进行采样,而是指定图像中需要采样的部分。默认为16,最小为1。这需要避免饱和度,因为直方图只能记录每个颜色值256像素,否则会过载。
  • GPUImageHistogramGenerator:这是一个特殊滤镜,主要用于与GPUImageHistogramFilter一起使用。它生成由GPUImageHistogramFilter生成的颜色直方图的输出表示,但它可以被重新用于显示其他类型的值。它接受一个图像并查看中心(垂直)像素。然后在输出纹理中将RGB组成部分的数值分别以不同颜色的图线显示。您可能需要为此滤镜强制大小,以便其输出可见。

  • GPUImageAverageColor:该功能处理输入图像并计算场景的平均颜色,通过平均图像中每个像素的RGBA组件。使用降采样过程逐步在GPU上减小源图像的大小,然后在CPU上进行简短的平均计算。该过滤器输出无实际意义,但需要将colorAverageProcessingFinishedBlock属性设置为一个接受四个颜色组件和一个帧时间的块,并进行一些处理。

  • GPUImageLuminosity:类似于GPUImageAverageColor,该功能将图像减少为其平均亮度。需要设置luminosityProcessingFinishedBlock来处理该过滤器输出的亮度值和帧时间。

  • GPUImageChromaKeyFilter:对于图像中的特定颜色,将alpha通道设置为0。这与GPUImageChromaKeyBlendFilter类似,只是不采用第二张图像进行匹配颜色混合,而已给定颜色透明。

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

图像处理

  • GPUImageTransformFilter:为图像应用任意2-D或3-D转换

    • affineTransform:接受CGAffineTransform以在2-D中调整图像
    • transform3D:接受CATransform3D以在3-D中操作图像
    • 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,默认值为1.0
  • GPUImageGaussianBlurFilter:一种硬件优化的、可变半径的高斯模糊

    • texelSpacingMultiplier:纹理元素间距的乘数,范围为0.0到1.0,默认为1.0。调整此参数可能会略微增加模糊强度,但会在结果中引入伪影。强烈建议首先使用其他参数。
    • blurRadiusInPixels:用于模糊的像素半径,默认为2.0。这调整高斯分布函数中的sigma变量。
    • blurRadiusAsFractionOfImageWidth:
    • blurRadiusAsFractionOfImageHeight:设置这些属性将允许模糊半径随图像大小缩放
    • blurPasses:连续模糊输入图像的次数。次数越多,滤镜越慢。
  • GPUImageBoxBlurFilter:一种硬件优化的、可变半径的箱型模糊

    • texelSpacingMultiplier:纹理元素间距的乘数,范围为0.0到1.0,默认为1.0。调整此参数可能会略微增加模糊强度,但会在结果中引入伪影。强烈建议首先使用其他参数。
    • blurRadiusInPixels:用于模糊的像素半径,默认为2.0。这调整高斯分布函数中的sigma变量。
    • blurRadiusAsFractionOfImageWidth:
    • blurRadiusAsFractionOfImageHeight:设置这些属性将允许模糊半径随图像大小缩放
    • blurPasses:连续模糊输入图像的次数。次数越多,滤镜越慢。
  • GPUImageSingleComponentGaussianBlurFilter:GPUImageGaussianBlurFilter的修改版本,只对红色组件起作用

    • texelSpacingMultiplier:纹理元素间距的乘数,范围为0.0到1.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到1.0,默认为4.0
    • distanceNormalizationFactor:中心颜色与样本颜色之间距离的归一化因子,默认为8.0。
  • GPUImageTiltShiftFilter:模拟倾斜移轴镜头效果

    • blurRadiusInPixels:基础模糊的半径,默认为7.0。
    • topFocusLevel:图像中焦点区域顶部的规范化位置,该值应低于bottomFocusLevel,默认为0.4
    • bottomFocusLevel:图像中焦点区域底部的规范化位置,该值应高于topFocusLevel,默认为0.6
    • focusFallOffRate:远离焦点区域时图像变模糊的速度,默认为0.2
  • GPUImage3x3ConvolutionFilter:对图像运行3x3卷积核

    • convolutionKernel:卷积核是一个应用给像素及其8个相邻像素的值3x3矩阵。矩阵按行主序指定,最左上角的像素为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设备相机类型,因此可能需要一些实验来找到适合您案例的正确设置。默认值是0.20。
  • GPUImageNobleCornerDetectionFilter:在Harris角点检测器上运行Noble变体。它的行为与上面的Harris检测器描述类似。

    • blurRadiusInPixels:高斯模糊的半径。默认值是2.0。
    • sensitivity:在过滤器中生成的角点映射的动态范围的内部缩放因子。默认值是5.0。
    • threshold:检测到角点的阈值。这可能取决于大小、光照条件和iOS设备相机类型,因此可能需要一些实验来找到适合您案例的正确设置。默认值是0.2。
  • GPUImageShiTomasiCornerDetectionFilter:运行Shi-Tomasi特征检测器。它的行为与上面的Harris检测器描述类似。

    • blurRadiusInPixels:高斯模糊的半径。默认值是2.0。
    • sensitivity:过滤器中生成的角点映射的动态范围的内部缩放因子。默认值是1.5。
    • threshold:检测到角点的阈值。这可能取决于大小、光照条件和iOS设备相机类型,因此可能需要一些实验来找到适合您案例的正确设置。默认值是0.2。
  • GPUImageNonMaximumSuppressionFilter:当前仅作为Harris角点检测过滤器的一部分使用,这将在每个像素周围采样1像素的框,并确定中心像素的红色通道是否是该区域的最大值。如果是,则保持不变。如果不是,则将其所有颜色分量设置为0。

  • GPUImageXYDerivativeFilter:哈里斯角点检测过滤器的一个内部组件,它计算一个像素左边和右边的像素之间的平方差,以及上方和下方的像素之间的平方差,然后是这两个差的乘积。

  • GPUImageCrosshairGenerator:在图像上绘制一系列的十字准线,通常用于识别机器视觉特征。它不接收像其他过滤器那样的标准图像,而是通过- renderCrosshairsFromArray:count:方法接收一系列点来实际绘图。您需要强制此过滤器以所需的特定输出大小渲染。

    • crosshairWidth:要在屏幕上绘制的十字准线宽度(以像素为单位)。
  • 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:使用霍夫变换进入并行坐标空间检测图像中的线条。这种方法完全是基于布尔诺技术大学Graph@FIT研究小组开发的PC线条处理过程,并在他们的出版物中描述:M. Dubská, J. Havel, and A. Herout. Real-Time Detection of Lines using Parallel Coordinates and OpenGL。 SCCG 2011会议论文集,布拉迪斯拉发,斯洛伐克,第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, and A. Herout. PClines — Line detection using parallel coordinates. 2011 IEEE Conference on Computer Vision and Pattern Recognition (CVPR),第1489-1494页(《http://medusa.fit.vutbr.cz/public/data/papers/2011-CVPR-Dubska-PClines.pdf》)。

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

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

    • blurSize: 模糊大小的乘数,范围从0.0到1.0,默认为1.0。
    • blurAngle: 模糊的角度方向,以度为单位。默认为0度。
  • GPUImageZoomBlurFilter: 对图像应用方向运动模糊。

    • blurSize: 模糊大小的乘数,范围从0.0到1.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:应用于两个图像的泊松混合

    • 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)
    • pixelSize:像素尺寸的分数部分,分为宽度和高度组件。默认为 (0.05, 0.05)
  • GPUImagePolkaDotFilter:将图像分解为一组在规则网格中的彩色点

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

    • fractionalWidthOfAPixel:半色调点的大小,作为图像宽度和高度的分数(0.0 - 1.0,默认 0.05)
  • GPUImageCrosshatchFilter:将图像转换为黑白网状图案

    • crossHatchSpacing:用作网状图案间距的图像的分数宽度。默认为 0.03。
    • lineWidth:交叉线相对于交叉线线的相对宽度。默认为 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:这些参数影响检测到的边缘的可见性
    • threshold:边缘检测的敏感度,低值更有敏感度。范围从 0.0 到 1.0,默认为 0.2。
    • quantizationLevels:在最终图像中表示的颜色级别数。默认为 10.0
  • GPUImageSmoothToonFilter:使用与 GPUImageToonFilter 相似的过程,但它先应用高斯模糊以平滑噪声,然后再应用卡通效果。

    • texelWidth:
    • texelHeight:这些参数影响检测到的边缘的可见性
    • blurRadiusInPixels:高斯模糊的半径。默认值是2.0。
    • threshold:边缘检测的敏感度,低值更有敏感度。范围从 0.0 到 1.0,默认为 0.2。
    • quantizationLevels:在最终图像中表示的颜色级别数。默认为 10.0
  • GPUImageEmbossFilter:对图像应用压印效果

    • intensity:压印的强度,从 0.0 到 4.0,正常水平为 1.0
  • GPUImagePosterizeFilter:这减少颜色动态范围到指定的步数,从而导致图像的卡通化简单阴影。

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

    • radius:从中心点到应用扭曲的半径,默认为 0.5
    • center:图像中心(在从 0 到 1.0 的归一化坐标中), twist 的起点,默认为 (0.5, 0.5)
    • angle:应用到图像的扭曲量,默认为 1.0
  • GPUImageBulgeDistortionFilter:在图像上创建膨胀扭曲

    • radius:从中心点到应用扭曲的半径,默认为 0.25
    • center:图像中心(在从 0 到 1.0 的归一化坐标中),扭曲的起点,默认为 (0.5, 0.5)
    • scale:要应用的扭曲量,从 -1.0 到 1.0,默认为 0.5
  • GPUImagePinchDistortionFilter:创建图像的压痕扭曲

    • radius:从中心点到应用扭曲的半径,默认为 1.0
    • center:图像中心(在从 0 到 1.0 的归一化坐标中),扭曲的起点,默认为 (0.5, 0.5)
    • scale:要应用的扭曲量,从 -2.0 到 2.0,默认为 1.0
  • GPUImageStretchDistortionFilter:创建图像的拉伸扭曲

    • center:图像中心(在从 0 到 1.0 的归一化坐标中),扭曲的起点,默认为 (0.5, 0.5)
  • GPUImageSphereRefractionFilter:模拟通过玻璃球体的折射

    • center:应用扭曲的中心点,默认为 (0.5, 0.5)
    • radius:扭曲的半径,范围为 0.0 到 1.0,默认为 0.25
    • refractiveIndex:球体的折射率,默认为 0.71
  • GPUImageGlassSphereFilter:与GPUImageSphereRefractionFilter相同,只是图像没有反转,而且在玻璃边缘有一点点霜状效果

    • center:应用扭曲的中心点,默认为 (0.5, 0.5)
    • radius:扭曲的半径,范围为 0.0 到 1.0,默认为 0.25
    • refractiveIndex:球体的折射率,默认为 0.71
  • GPUImageVignetteFilter:执行深景效果,边缘图像逐渐变暗

    • x:
    • y:深景的方向强度,默认x=0.75,y=0.5
  • GPUImageKuwaharaFilter:Kuwahara图像抽象,基于Kyprianidis等人发表在GPU Pro专辑中的作品“Anisotropic Kuwahara Filtering on the GPU”。这会产生类似油画的图像,但计算成本极高,因此在iPad 2上渲染一帧可能需要几秒钟。这可能最适合用作静态图片。

    • radius:指定在应用过滤器时要测试的以像素计数为中心像素外的像素数,默认为4。更高的值会创建更加抽象的图像,但代价是处理时间大大增加。
  • GPUImageKuwaharaRadius3Filter:Kuwahara过滤器的修改版,优化以仅在三个像素范围内工作

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

    • colorStart:
    • colorFinish:生成的噪声的颜色范围
    • scale:生成的噪声的缩放
  • GPUImageCGAColorspaceFilter:模拟CGA显示器的颜色空间

  • GPUImageMosaicFilter:这个过滤器采用输入瓦片集,瓦片必须是按亮度升序排列的。它查看输入图像,并根据该瓦片的亮度将每个显示屏瓦片替换为输入瓦片。最初的想法是复制其他应用程序中看到的ASCII视频过滤器,但瓦片集可以是任何东西。

    • inputTileSize:
    • numTiles:
    • displayTileSize:
    • colorOn:
  • GPUImageJFAVoronoiFilter:生成Voronoi图,用于后续阶段。

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

    • sizeInPixels:单个元素的大小

您还可以像上面描述的那样使用类似C的OpenGL着色语言轻松编写自己的自定义过滤器。

示例应用

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

SimpleImageFilter

在应用程序启动时将一个捆绑的JPEG图像加载到应用程序中,应用过滤器到它,并将结果渲染到屏幕上。此外,这个示例还展示了两种获取图像、过滤它并将其保存到磁盘的方式。

SimpleVideoFilter

对实时视频流应用像素化过滤器,带有UISlider控件,可让您调整实时视频上的像素大小。

SimpleVideoFileFilter

从磁盘加载电影文件,应用锐化蒙版过滤器到它,并将过滤后的结果重新编解码为另一部电影。

MultiViewFilterExample

从单个摄像头馈送中,四个视图填充了应用于摄像头的实时过滤器。一个是直接摄像头视频,一个是预先编程的棕褐色调,另外两个是基于着色程序的自定义过滤器。

FilterShowcase

这展示了GPUImage中提供的每个滤镜。

基准测试套件

此实验用来测试整个框架的性能,通过与CPU密集型例程和Core Image进行测试。包括静态图像和视频的基准测试针对这三个对象进行,并在应用程序中显示结果。

立方体示例

这演示了GPUImage与OpenGL ES渲染交互的能力。从相机捕获帧,对它们应用深色调滤镜,然后将它们输入到一个纹理中,应用到一个你可以用手指旋转的立方体上。然后,立方体被渲染到一个纹理支持的帧缓冲对象中,该纹理再被馈送回GPUImage,以应用马赛克滤镜并在屏幕上渲染。

换句话说,该应用程序的路径是:相机 -> 深色调滤镜 -> 立方体 -> 马赛克滤镜 -> 显示。

颜色目标跟踪

这是从http://www.sunsetlakesoftware.com/2010/10/22/gpu-accelerated-video-processing-mac-and-ios迁移过来的颜色跟踪示例,现在使用GPUImage,该应用使用场景中的颜色跟踪实时相机视频中的对象。您可以切换的四种视图包括原始相机流、与颜色阈值匹配的像素为白色的相机流、经过处理的视频,其中位置被编码为通过阈值测试的像素中的颜色,以及带有跟踪选定颜色的点的实时视频流。轻触屏幕可改变跟踪的颜色的匹配,以与手指下像素的颜色相匹配。轻触并拖动屏幕可以调整颜色阈值,使其更加宽容或严格。这在第二个“颜色阈值”视图中最为明显。

当前,最后一步的颜色平均处理全部在CPU上完成,所以这部分非常慢。