GPUImage-Goonbee 0.1.6.1

GPUImage-Goonbee 0.1.6.1

测试已测试
语言语言 Obj-CObjective C
许可 BSD
发布上次发布2014年12月

Luka Mirosevic维护。



  • Luka Mirosevic

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 的耗时仅为 2.5 毫秒,应用伽玛滤镜并显示,而使用 Core Image 执行相同操作耗时 106 毫秒。基于 CPU 的处理需要 460 毫秒,这使得 GPUImage 在此硬件上比 Core Image 快 40 倍,比基于 CPU 的处理快 184 倍。然而,对于像更大半径的高斯模糊等更复杂的操作,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框架进行弱链接,否则您在创建用于上传到应用商店或用于预分发归档时会看到崩溃信息“符号未找到:_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项目文件拖放到应用程序项目中(就像在静态库目标中做的那样)。

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

这应该会导致GPUImage作为框架构建。在Xcode 6中,这也会作为模块构建,这将允许您在Swift项目中使用它。如上设置,您只需要使用以下内容:

import GPUImage

即可将其包含进来。

然后您需要添加一个新的“复制文件”构建阶段,将目标设置为“框架”,并将GPUImage.framework构建产品添加到其中。这将允许框架与应用程序捆绑(否则,在执行时您将看到神秘的“dyld:无法加载库:@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子类在屏幕上显示这些过滤的视频帧。

可以通过设置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保存在应用的文档目录中。

请注意,由于纹理尺寸限制,本框架目前无法处理宽度和高度超过2048像素的图像(这些是iPhone 4S、iPad 2或Retina iPad之前的旧设备)。这意味着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在同一滤镜中使用framebuffers来保存内存,因此如果您需要保留滤镜的framebuffer以进行手动图像捕获,您需要提前通知它。

对于要应用于图像的单个滤镜,您可以简单地这样做

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

编写自定义滤镜

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

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

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

其中,用于片段着色器的扩展名为.fsh。另外,您可以使用 initWithFragmentShaderFromString:初始化器以字符串形式提供片段着色器,如果您不希望在您的应用程序包中包含片段着色器。

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

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认为它们是源代码文件。为了解决这个问题,您需要手动将着色器从编译源代码的构建阶段移动到复制bundle资源的.buildsetting中,以便将着色器包含在您的应用程序bundle中。

视频过滤和重新编码

可以通过GPUImageMovie类将电影加载到框架中,过滤后,然后使用GPUImageMovieWriter将其写出来。GPUImageMovieWriter也能在实时录制来自iPhone 4摄像头的640x480视频,因此可以直接将经过过滤的视频源输入到其中。目前,GPUImageMovieWriter可以在iPhone 4上以高达20 fps的实时录制720p视频,在iPhone 4S上以高达30 fps录制720p和1080p视频(以及在新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类导出和导入从OpenGL ES来使用纹理,分别。这允许您从渲染到具有绑定纹理的帧缓冲对象的开源OpenGL ES场景中录制电影,或者过滤视频或图片,然后将它们作为纹理输入到OpenGL ES中进行场景显示。

使用这种方法的一个警告是,在这些过程中使用的纹理必须在GPUImage的OpenGL ES上下文和任何其他上下文之间通过共享组或类似的方式共享。

内置过滤器

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

色彩调整

  • GPUImageBrightnessFilter:调整图像的亮度

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

    • exposure:调整的曝光(-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。
    • 绿色:
    • 蓝色:
  • GPUImageHueFilter:调整图像的色调

    • 色调:色调角度,以度为单位。默认为90度。
  • GPUImageToneCurveFilter:根据每个颜色通道的样条曲线调整图像的色调。

    • redControlPoints:
    • greenControlPoints:
    • blueControlPoints:
    • rgbCompositeControlPoints:色调曲线接收一系列控制点,以定义每个颜色成分或所有三个颜色的样条曲线。它们被存储为在NSArray中包装的NSValue-CGPoints,其X和Y坐标从0 - 1进行归一化。默认值为(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通道的值(0.0 - 1.0,默认为1.0)
  • GPUImageSolidColorGenerator:输出具有纯色的图像。您需要使用 -forceProcessingAtSize 定义图像大小

    • 颜色:用于填充图像的四个组件格式颜色。
  • 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:对于图像中的给定颜色,将Alpha通道设置为0。这与 GPUImageChromaKeyBlendFilter 类似,只是它不混合第二个图像以匹配给定颜色,而是仅使给定颜色透明。

    • 阈值敏感度:颜色匹配需要与目标颜色有多接近才能进行替换(默认值为0.4)
    • 平滑度:颜色匹配的混合平滑程度(默认值为0.1)

图像处理

  • GPUImageTransformFilter:对图像应用任意2维或3维变换

    • 仿射变换:接受一个CGAffineTransform来调整图像在2维空间中
    • 三维变换:接受一个CATransform3D来操作图像在3维空间中
    • 忽略纵横比:默认情况下,变换后图像的纵横比得到保持,但可以设置为YES以使变换独立于纵横比
  • GPUImageCropFilter:将图像裁剪到特定区域,然后将该区域传递到滤镜的下一阶段

    • 裁切区域:裁剪的矩形区域,归一化到坐标0.0 - 1.0。位置(0.0, 0.0)在图像的左上角。
  • GPUImageLanczosResamplingFilter:允许您使用Lanczos重采样上采样或下采样图像,这比标准的线性或三线性插值质量明显更好。只需使用-forceProcessingAtSize:来设置滤镜的目标输出分辨率,图像将以该新大小进行重采样。

  • GPUImageSharpenFilter:锐化图像

    • 锐度:应用于图像的锐度调整(-4.0 - 4.0,默认值为0.0)
  • GPUImageUnsharpMaskFilter:应用不锐化遮罩

    • 模糊半径(像素为单位):底层高斯模糊的模糊半径。默认值为4.0。
    • 强度:锐化的强度,从0.0开始,默认值为1.0
  • GPUImageGaussianBlurFilter:硬件优化的、可变半径的高斯模糊

    • texel稀疏度倍增器:texel之间间隔的倍增器,范围从0.0开始,默认值为1.0。调整此值可能会略微增加模糊强度,但会在结果中引入伪影。强烈建议首先使用其他参数。
    • 模糊半径(像素为单位):用于模糊的像素半径,默认值为2.0。这调整高斯分布函数中的sigma变量。
    • 模糊半径作为图像宽度的分数:
    • 模糊半径作为图像高度的分数:设置这些属性将使模糊半径随着图像尺寸的变化而缩放
    • 模糊次数:对输入图像连续模糊的次数。越多次,滤镜就越慢。
  • GPUImageBoxBlurFilter:硬件优化的、可变半径的盒式模糊

    • texel稀疏度倍增器:texel之间间隔的倍增器,范围从0.0开始,默认值为1.0。调整此值可能会略微增加模糊强度,但会在结果中引入伪影。强烈建议首先使用其他参数。
    • 模糊半径(像素为单位):用于模糊的像素半径,默认值为2.0。这调整高斯分布函数中的sigma变量。
    • 模糊半径作为图像宽度的分数:
    • 模糊半径作为图像高度的分数:设置这些属性将使模糊半径随着图像尺寸的变化而缩放
    • 模糊次数:对输入图像连续模糊的次数。越多次,滤镜就越慢。
  • GPUImageSingleComponentGaussianBlurFilter:GPUImageGaussianBlurFilter的修改版,仅对红色分量进行操作

    • texel稀疏度倍增器:texel之间间隔的倍增器,范围从0.0开始,默认值为1.0。调整此值可能会略微增加模糊强度,但会在结果中引入伪影。强烈建议首先使用其他参数。
    • 模糊半径(像素为单位):用于模糊的像素半径,默认值为2.0。这调整高斯分布函数中的sigma变量。
    • 模糊半径作为图像宽度的分数:
    • 模糊半径作为图像高度的分数:设置这些属性将使模糊半径随着图像尺寸的变化而缩放
    • 模糊次数:对输入图像连续模糊的次数。越多次,滤镜就越慢。
  • GPUImageGaussianSelectiveBlurFilter:高斯模糊,在圆形区域内保留焦点

    • 模糊半径(像素为单位):用于模糊的像素半径,默认值为5.0。这调整高斯分布函数中的sigma变量。
    • 排除圆形区域半径:排除从模糊中的圆形区域半径
    • 排除圆形区域中心点:排除从模糊中的圆形区域中心点
    • 排除模糊大小:被模糊部分和清晰区域之间的面积大小
    • 纵横比:图像的纵横比,用于调整焦点区域的圆形度。默认情况下,它匹配图像纵横比,但可以覆盖此值。
  • GPUImageGaussianBlurPositionFilter:GPUImageGaussianSelectiveBlurFilter的逆,仅对特定圆内的图像应用模糊

    • 模糊大小:模糊大小的倍增器,范围从0.0开始,默认值为1.0
    • 模糊中心:模糊中心,默认值为0.5, 0.5
    • 模糊半径:模糊半径,默认值为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:卷积核是一个应用于像素及其8个周围像素的3x3矩阵的值。矩阵按行优先顺序指定,左上角的像素为1.1和右下角的3.3。如果矩阵中的值不合计为1.0,则可能会变亮或变暗图像。
  • GPUImageSobelEdgeDetectionFilter:索贝尔边缘检测,边缘以白色突出显示。

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

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

    • 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:在一个输入图像上运行哈里斯角落检测算法,并产生一个以白色像素显示角落点而其余部分为黑色的图像。可以设置cornersDetectedBlock,并将在回调中提供一个角落列表(在归一化的0..1 X,Y坐标中),您可以在该回调中进行任何额外的操作。

    • blurRadiusInPixels:底层高斯模糊的半径。默认为2.0。
    • sensitivity:过滤器中生成的角落图内部缩放因子,用于调整动态范围。默认为5.0。
    • 阈值:该点被检测为角时的阈值。这可能会因尺寸、光照条件和iOS设备相机类型而有很大差异,因此可能需要进行一些实验才能获得合适的值。默认值为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:该功能在图像上绘制一系列十字准线,最常用于标识机器视觉特征。它不接收标准图像,而是接收其 -renderCrosshairsFromArray: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:这是一种基于高通滤波器的运动检测器。您设定motionDetectionBlock,在每帧截图时,它都会为您提供场景中任何检测到的运动的质心(在归一化的X,Y坐标中),以及场景的运动强度。

    • lowPassFilterStrength:这个值控制背景中使用的低通滤波器的强度,用于确定与输入帧进行比较的基准。范围从0.0到1.0,默认值为0.5。
  • GPUImageHoughTransformLineDetector:使用空闲坐标空间中的霍夫变换检测图像中的线条。这种方法完全基于布拉格技术大学Graph@FIT研究小组开发的PC线条处理过程,并在他们的出版物中描述:M. Dubská,J. Havel,和A. Herout。使用并行坐标和OpenGL实时检测线条。在2011年SCCG会议上的报告,斯洛伐克布拉迪斯拉发,第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年IEEE计算机视觉和模式识别会议(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
    • blurAngle:模糊角的度数。默认为0度。
  • GPUImageZoomBlurFilter:在图像上应用方向性运动模糊

    • blurSize:模糊大小乘数,从0.0到无穷大,默认值为1.0
    • blurCenter:模糊的归一化中心。(0.5,0.5)默认。

混合模式

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

    • 阈值敏感度:颜色匹配需要与目标颜色有多接近才能进行替换(默认值为0.4)
    • 平滑度:颜色匹配的混合平滑程度(默认值为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:将视频转换为看起来像素描的效果。这仅仅是索贝尔边缘检测滤波器,并且颜色被反转。

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

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

    • 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 的归一化坐标),默认值为 (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-class设备兼容。它们试图展示框架的各个方面,因此在框架开发过程中应作为API的最佳示例使用。这些包括

SimpleImageFilter

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

SimpleVideoFilter

将马赛克滤镜应用于实时视频流,并有一个UISlider控件,允许您调整实时视频上的像素大小。

SimpleVideoFileFilter

从磁盘加载电影文件,对其应用模糊滤镜,然后将滤镜后的结果重新编码为另一部电影。

MultiViewFilterExample

来自单个摄像头输入,填充了实时滤镜的应用程序中的四个视图。一个是直接的视频,一个是预先编程的深棕色,另外两个是基于着色程序的定制滤镜。

FilterShowcase

此示例演示了GPUImage提供的每个过滤器。

BenchmarkSuite

此代码用于通过测试CPU密集型例程和核心图像来测试整体框架的性能。涉及静态图像和视频的基准测试运行在这三处,结果在应用程序中显示。

CubeExample

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

换句话说,这个应用程序的流程是摄像头 -> 深色调滤镜 -> 立方体 -> 像素化滤镜 -> 显示。

ColorObjectTracking

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

目前,最后一步中颜色平均的所有处理都是在CPU上进行的,因此这部分非常慢。