注册

一个开源的iOS框架,用于基于GPU的图像和视频处理

概述

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 ms即可从相机上传帧,应用伽玛滤镜和显示,而使用Core Image进行相同操作则需要106 ms。基于CPU的处理需要460毫秒,因此使GPUImage在此硬件上进行此操作的速度比Core Image快40倍,比与CPU绑定的处理快184倍。在iPhone 4S上,在这种情况下,GPUImage仅比Core Image快4倍,比CPU绑定处理快102倍。但是,对于更高半径的高斯模糊等更复杂的操作,Core Image当前超过GPUImage。


技术要求

  • OpenGL ES 2.0:使用此功能的应用程序将无法在原始iPhone,iPhone 3G以及第一代和第二代iPod touch上运行
  • iOS 4.1作为部署目标(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添加为目标依赖项。最后,您需要将libGPUImage.a库从GPUImage框架的Products文件夹拖到应用程序目标的Link Binary With Libraries构建阶段。

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

  • CoreMedia
  • CoreVideo
  • OpenGLES
  • AVFoundation
  • QuartzCore


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

要在您的应用程序中使用GPUImage类,只需使用以下内容包括核心框架头即可:

#import "GPUImage.h"

注意:如果尝试使用Interface Builder构建接口时,如果遇到错误“ Interface Builder中的未知类GPUImageView”或类似错误,则可能需要在项目的构建设置中将-ObjC添加到Other Linker Flags。

另外,如果您需要将其部署到iOS 4.x,则似乎当前版本的Xcode(4.3)要求您在最终应用程序中弱链接Core Video框架,否则会崩溃并显示消息“找不到符号” :_CVOpenGLESTextureCacheCreate”,当您创建要上传到App Store或临时分发的归档文件时。为此,请转到项目的“构建阶段”选项卡,展开“使用库链接二进制文件”组,然后在列表中找到CoreVideo.framework。将列表最右边的设置从“必需”更改为“可选”。

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

在命令行上构建静态库

如果您不想将项目作为依赖项包含在应用程序的Xcode项目中,则可以为iOS Simulator或设备构建通用静态库。为此,请build.sh在命令行上运行生成的库和头文件将位于build/Release-iphone您也可以通过更改中的IOSSDK_VER变量来更改iOS SDK的build.sh版本(可以使用找到所有可用版本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”错误)。


过滤实况视频

要从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];

这会使用尝试以640x480捕获的预设来设置来自iOS设备的背面摄像头的视频源。该视频是通过处于纵向模式的界面捕获的,在该模式下,横向安装的摄像机需要在显示之前旋转其视频帧。然后,使用文件CustomShader.fsh中的代码将自定义滤镜设置为来自摄像机的视频帧的目标。最终,这些过滤后的视频帧将在UIView子类的帮助下显示在屏幕上,该子类可以呈现此管道产生的过滤后的OpenGL ES纹理。

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

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

另外,如果您希望启用麦克风音频捕获以录制到电影中,则需要将相机的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 4S,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 5.0开始)上的Core Image相比,此框架的一大优势是能够编写自己的自定义图像和视频处理过滤器。这些过滤器作为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框架中使用,需要前两行采用textureCoordinate变化(对于纹理中的当前坐标,归一化为1.0)和inputImageTexture统一(对于实际的输入图像帧纹理) 。

着色器的其余部分在传入的纹理中的该位置捕获像素的颜色,以产生棕褐色调的方式对其进行操作,并将该像素颜色写出以用于下一步处理管道。

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

过滤和重新编码电影

可以通过GPUImageMovie类将电影加载到框架中,进行过滤,然后使用GPUImageMovieWriter将其写出。GPUImageMovieWriter的速度也足够快,可以以640x480的速度从iPhone 4的摄像头实时录制视频,因此可以将直接过滤的视频源输入其中。目前,GPUImageMovieWriter的速度足以在iPhone 4上以高达20 FPS的速度录制实时720p视频,而在iPhone 4S(以及新iPad)上以30 FPS的速度录制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:调整图像的灰度系数

    • gamma:要应用的gamma调整(0.0-3.0,默认值为1.0)
  • GPUImageLevelsFilter:类似Photoshop的色阶调整。min,max,minOut和maxOut参数在[0,1]范围内浮动。如果来自Photoshop的参数在[0,255]范围内,则必须首先将它们转换为[0,1]。gamma / mid参数是一个float> =0。它与Photoshop中的值匹配。如果要对RGB以及各个通道应用级别,则需要两次使用此滤镜-首先用于单个通道,然后用于所有通道。

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

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

    • 红色:每个色彩通道相乘的归一化值。范围从0.0开始,默认值为1.0。
    • 绿色
    • 蓝色
  • GPUImageHueFilter:调整图像的色调

    • 色调:色调角度,以度为单位。默认为90度
  • GPUImageVibranceFilter:调整图像的鲜艳度

    • vibrance:要应用的vibrance调整,默认设置为0.0,建议的最小/最大值分别为-1.2和1.2。
  • GPUImageWhiteBalanceFilter:调整图像的白平衡。

    • temperature:调整图像所用的温度,以ºK为单位。值4000非常凉爽,而7000非常温暖。默认值为5000。请注意,在4000和5000之间的比例在视觉上与在5000和7000之间的比例几乎相同。
    • 色调:用于调整图像的色调。值-200表示非常绿色,而200表示非常粉红色。默认值为0。
  • GPUImageToneCurveFilter:基于样条曲线为每个颜色通道调整图像的颜色。

    • redControlPoints
    • greenControlPoints
    • blueControlPoints
    • rgbCompositeControlPoints:色调曲线采用一系列控制点,这些控制点定义了每个颜色分量或复合物中所有三个分量的样条曲线。这些以NSValue包裹的CGPoints的形式存储在NSArray中,其标准化的X和Y坐标为0-1。默认值为(0,0),(0.5,0.5),(1,1)。
  • GPUImageHighlightShadowFilter:调整图像的阴影和高光

    • 阴影:增加阴影以使阴影变淡,从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:基于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:根据每个像素的亮度,将图像转换为单色版本

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

    • firstColor:第一种和第二种颜色分别指定什么颜色替换图像的暗区和亮区。默认值为(0.0,0.0,0.5)amd(1.0,0.0,0.0)。
    • secondColor
  • GPUImageHazeFilter:用于添加或删除雾度(类似于UV滤镜)

    • distance:所应用颜色的强度。默认值为0。最佳值为-.3到.3。
    • 斜率:颜色变化的量。默认值为0。最佳值为-.3到.3。
  • GPUImageSepiaFilter:简单的棕褐色调滤镜

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

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

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

    • threshold:亮度阈值,从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相似,只是不将第二个图像混合为匹配的颜色,而不会在第二个图像中取而代之颜色透明。

    • thresholdSensitivity:颜色匹配需要与要替换的目标颜色之间的接近程度(默认值为0.4)
    • 平滑:混合颜色时的平滑程度(默认值为0.1)

图像处理

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

    • affineTransform:这需要一个CGAffineTransform来调整二维图像
    • transform3D:这需要一个CATransform3D来处理3-D图像
    • ignoreAspectRatio:默认情况下,将保持变换图像的纵横比,但是可以将其设置为YES,以使变换与纵横比无关
  • GPUImageCropFilter:将图像裁剪到特定区域,然后仅将该区域传递到滤镜的下一个阶段

    • cropRegion:要裁剪出图像的矩形区域,将其标准化为0.0-1.0的坐标。(0.0,0.0)位置在图像的左上方。
  • GPUImageLanczosResamplingFilter:这使您可以使用Lanczos重采样对图像进行上采样或下采样,其质量明显优于标准线性或三线性插值。只需使用-forceProcessingAtSize:即可设置过滤器的目标输出分辨率,然后将针对该新大小重新采样图像。

  • GPUImageSharpenFilter:锐化图像

    • 清晰度:要应用的清晰度调整(-4.0-4.0,默认值为0.0)
  • GPUImageUnsharpMaskFilter:应用不清晰的蒙版

    • blurRadiusInPixels:基础高斯模糊的模糊半径。默认值为4.0。
    • 强度:锐化的强度,从在多达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:图像的纵横比,用于调整对焦区域的圆度。默认情况下,它与图像的宽高比匹配,但是您可以覆盖此值。
  • GPUImageGaussianBlurPositionFilterGPUImageGaussianSelectiveBlurFilter的反函数,仅在特定圆圈内应用模糊

    • blurSize:模糊大小的乘数,范围从0.0开始,默认为1.0
    • blurCenter:模糊的中心,默认为0.5、0.5
    • blurRadius:模糊的半径,默认为1.0
  • GPUImageiOSBlurFilter:尝试在控制中心等地方复制iOS 7上使用的背景模糊。

    • blurRadiusInPixels:用于模糊的半径(以像素为单位),默认值为12.0。这将调整高斯分布函数中的sigma变量。
    • 饱和度:饱和度范围从0.0(完全饱和)到2.0(最大饱和度),正常水平为0.8
    • 下采样:下采样然后上采样传入图像的程度,以最小化高斯模糊内的计算,默认值为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个像素。矩阵以行优先顺序指定,左上像素为one.one,右下像素为three.three。如果矩阵中的值之和不等于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:基础的模糊纹理像素间距乘数。默认值为1.0。
    • upperThreshold:任何梯度幅度大于此阈值的边都将通过并显示在最终结果中。默认值为0.4。
    • lowerThreshold:任何梯度幅度低于此阈值的边将失败,并从最终结果中删除。默认值为0.1。
  • GPUImageHarrisCornerDetectionFilter:在输入图像上运行哈里斯角点检测算法,并生成一个图像,这些角点为白色像素,其他所有颜色均为黑色。可以设置cornersDetectedBlock,并且在回调中将为您提供您要执行的所有其他操作的角列表(以标准化的0..1 X,Y坐标表示)。

    • blurRadiusInPixels:基础高斯模糊的半径。默认值为2.0。
    • 敏感度:一个内部比例因子,用于调整在滤镜中生成的边角图的动态范围。默认值为5.0。
    • threshold:检测到一个点作为拐角的阈值。根据尺寸,光线条件和iOS设备摄像头类型的不同,此方法可能会有很大的不同,因此可能需要一些试验才能确定适合您的情况。默认值为0.20。
附件下载及详细介绍及常见问题:https://github.com/BradLarson/GPUImage


0 个评论

要回复文章请先登录注册