测试已测试 | ✗ |
Lang语言 | Obj-CObjective C |
许可证 | BSD |
发布最新发布 | 2015 年 9 月 |
由 Ernesto Rivera,Ernesto Rivera,Dima Vartanian 维护。
Brad Larson
http://www.sunsetlakesoftware.com
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 中找到。
GPUImage使用OpenGL ES 2.0着色器执行图像和视频操作,比在CPU密集型程序中更快。然而,它隐藏了与OpenGL ES API交互的复杂性,通过简化的Objective-C接口来实现。此接口允许您定义图像和视频的输入源,将过滤器以链的形式附加,并将处理后的图像或视频发送到屏幕、UIImage或磁盘上的电影。
从源对象,这些是GPUImageOutput的子类,上传图像或视频帧。它们包括GPUImageVideoCamera(来自iOS摄像头的实时视频)、GPUImageStillCamera(使用摄像头拍照)、GPUImagePicture(静态图像)和GPUImageMovie(电影)。源对象将静态图像帧上传到OpenGL ES作为纹理,然后将这些纹理传递给处理链中的下一个对象。
链中的过滤器和后续元素遵守GPUImageInput协议,这使它们可以从链中前一个链接提供的或处理过的纹理中获取信息,并对其进行处理。链中进一步的对象被视为目标,可以通过向单个输出或过滤器添加多个目标来分支处理。
例如,一个从摄像头接收实时视频的应用程序,将该视频转换为棕色色调,然后在屏幕上显示视频,将设置一个如下所示的链
GPUImageVideoCamera -> GPUImageSepiaFilter -> GPUImageView
注意:如果您想在一个Swift项目中使用此代码,请使用“将此作为框架添加”部分中的步骤,而不是以下内容。Swift需要第三方代码的模块。
一旦您获得了框架的最新源代码,将其添加到应用程序中相当简单。首先,将GPUImage.xcodeproj文件拖动到您的应用程序的Xcode项目以将框架嵌入到您的项目中。接下来,转到应用程序的目标,并将GPUImage作为目标依赖项添加。最后,您需要将GPUImage框架的产品文件夹中的libGPUImage.a库拖动到应用程序目标的链接二进制文件库构建阶段。
GPUImage需要在您的应用程序中链接几个其他框架,因此您需要在应用程序目标中添加以下内容作为链接库
您还需要找到框架头文件,因此,在您的项目构建设置中,设置将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
找到)。
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];
电影在完成之前是不可用的,所以在这一点上之前被中断,录制将会丢失。
GPUImage 通过使用 GPUImageTextureOutput 和 GPUImageTextureInput 类分别导出和导入 OpenGL ES 的纹理。这允许您从一个渲染到具有绑定纹理的帧缓冲对象上的 OpenGL ES 场景中录制电影,或过滤视频或图像,然后将它们作为纹理馈送到 OpenGL ES 以在场景中显示。
与此方法的一个注意事项是,在这些过程中使用的纹理必须在 GPUImage 的 OpenGL ES 上下文中与其他上下文之间通过共享组或类似的方式共享。
目前有125个内置过滤器,分为以下类别
GPUImageBrightnessFilter:调整图像亮度
GPUImageExposureFilter:调整图像曝光
GPUImageContrastFilter:调整图像对比度
GPUImageSaturationFilter:调整图像的饱和度
GPUImageGammaFilter:调整图像的伽玛值
GPUImageLevelsFilter:类似Photoshop的级别调整。min、max、minOut和maxOut参数是[0, 1]范围内的浮点数。如果您有来自Photoshop的[0, 255]范围内的参数,您必须先将它们转换为[0, 1]。gamma/mid参数是一个大于等于0的浮点数。这与Photoshop中的值相匹配。如果您想同时将级别应用于RGB以及各个通道,您需要使用此滤镜两次 - 首先用于各个通道,然后用于所有通道。
GPUImageColorMatrixFilter:通过应用矩阵转换图像的颜色
GPUImageRGBFilter:调整图像的单独RGB通道
GPUImageHueFilter:调整图像的色调
GPUImageToneCurveFilter:基于每个颜色通道的样条曲线调整图像的颜色
GPUImageHighlightShadowFilter:调整图像的阴影和亮部
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:将图像转换为基于每个像素亮度的单色版本
GPUImageFalseColorFilter:使用图像的亮度在两个用户指定的颜色之间混合。
GPUImageHazeFilter:用于添加或去除雾霾(类似于UV滤镜)。
GPUImageSepiaFilter:简单的棕褐色滤镜。
GPUImageOpacityFilter:调整输入图像的alpha通道。
GPUImageSolidColorGenerator:输出具有纯色的生成图像。您需要使用-forceProcessingAtSize定义图像尺寸。
GPUImageLuminanceThresholdFilter:亮度高于阈值的像素将显示为白色,低于阈值的将显示为黑色。
GPUImageAdaptiveThresholdFilter:确定像素周围的局部亮度,然后如果像素亮度低于该局部亮度则将其变为黑色,如果高于则变为白色。这在提取在各种光照条件下下的文本时很有用。
GPUImageAverageLuminanceThresholdFilter:对场景的平均亮度进行连续调整,来实现阈值操作。
GPUImageHistogramFilter:分析输入图像,并创建包含各颜色值出现频率的输出直方图。此滤镜的输出是一个3像素高、256像素宽的图像,垂直中心像素包含对应于各种颜色值频率的像素。每个颜色值占用256宽度位置中的一个,从左边的0到右边的255。可以为单个颜色通道(kGPUImageHistogramRed、kGPUImageHistogramGreen、kGPUImageHistogramBlue)、图像的亮度(kGPUImageHistogramLuminance)或一次全部三个颜色通道(kGPUImageHistogramRGB)生成此直方图。
GPUImageHistogramGenerator:这是一个特殊滤镜,主要用于与GPUImageHistogramFilter一起使用。它生成由GPUImageHistogramFilter生成的颜色直方图的输出表示,但它可以被重新用于显示其他类型的值。它接受一个图像并查看中心(垂直)像素。然后在输出纹理中将RGB组成部分的数值分别以不同颜色的图线显示。您可能需要为此滤镜强制大小,以便其输出可见。
GPUImageAverageColor:该功能处理输入图像并计算场景的平均颜色,通过平均图像中每个像素的RGBA组件。使用降采样过程逐步在GPU上减小源图像的大小,然后在CPU上进行简短的平均计算。该过滤器输出无实际意义,但需要将colorAverageProcessingFinishedBlock属性设置为一个接受四个颜色组件和一个帧时间的块,并进行一些处理。
GPUImageLuminosity:类似于GPUImageAverageColor,该功能将图像减少为其平均亮度。需要设置luminosityProcessingFinishedBlock来处理该过滤器输出的亮度值和帧时间。
GPUImageChromaKeyFilter:对于图像中的特定颜色,将alpha通道设置为0。这与GPUImageChromaKeyBlendFilter类似,只是不采用第二张图像进行匹配颜色混合,而已给定颜色透明。
GPUImageTransformFilter:为图像应用任意2-D或3-D转换
GPUImageCropFilter:将图像裁剪到特定区域,然后将该区域传递到滤波器的下一阶段
GPUImageLanczosResamplingFilter:使用Lanczos重采样技术可以上采样或下采样图像,其结果比标准的线性或三线性插值质量明显更好。只需使用-forceProcessingAtSize:来设置滤波器的目标输出分辨率,图像就会重采样为此新大小。
GPUImageSharpenFilter:锐化图像
GPUImageUnsharpMaskFilter:应用锐化蒙版
GPUImageGaussianBlurFilter:一种硬件优化的、可变半径的高斯模糊
GPUImageBoxBlurFilter:一种硬件优化的、可变半径的箱型模糊
GPUImageSingleComponentGaussianBlurFilter:GPUImageGaussianBlurFilter的修改版本,只对红色组件起作用
GPUImageGaussianSelectiveBlurFilter:保留圆形区域内的焦点的高斯模糊
GPUImageGaussianBlurPositionFilter:GPUImageGaussianSelectiveBlurFilter的逆,只在特定圆圈内应用模糊
GPUImageiOSBlurFilter:尝试复制iOS 7在控制中心等位置使用的背景模糊效果
GPUImageMedianFilter:对于3x3区域内的三个颜色分量的中值进行计算
GPUImageBilateralFilter:一种双边模糊,尝试模糊相似的颜色值,同时保留锐利的边缘
GPUImageTiltShiftFilter:模拟倾斜移轴镜头效果
GPUImage3x3ConvolutionFilter:对图像运行3x3卷积核
GPUImageSobelEdgeDetectionFilter:Sobel边缘检测,边缘用白色突出显示
GPUImagePrewittEdgeDetectionFilter:Prewitt边缘检测,边缘用白色突出显示
GPUImageThresholdEdgeDetectionFilter:执行Sobel边缘检测,但应用阈值而不是给出渐变的强度值
GPUImageCannyEdgeDetectionFilter:这是使用完整的Canny算法来突出显示单像素宽度的边缘。
GPUImageHarrisCornerDetectionFilter:在输入图像上运行Harris角点检测算法,生成一个白色像素表示角点、其余部分为黑色的图像。可以设置cornersDetectedBlock,并在回调中提供列表中的角点(以归一化的0..1 X, Y坐标),以便执行任何额外的操作。
GPUImageNobleCornerDetectionFilter:在Harris角点检测器上运行Noble变体。它的行为与上面的Harris检测器描述类似。
GPUImageShiTomasiCornerDetectionFilter:运行Shi-Tomasi特征检测器。它的行为与上面的Harris检测器描述类似。
GPUImageNonMaximumSuppressionFilter:当前仅作为Harris角点检测过滤器的一部分使用,这将在每个像素周围采样1像素的框,并确定中心像素的红色通道是否是该区域的最大值。如果是,则保持不变。如果不是,则将其所有颜色分量设置为0。
GPUImageXYDerivativeFilter:哈里斯角点检测过滤器的一个内部组件,它计算一个像素左边和右边的像素之间的平方差,以及上方和下方的像素之间的平方差,然后是这两个差的乘积。
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:该过滤器将低通滤波器应用于输入的视频帧。这基本上是累积前一帧的加权移动平均和当前帧。这可以用于降噪视频、添加运动模糊或用于创建高通滤波器。
GPUImageHighPassFilter:该过滤器将高通滤波器应用于输入的视频帧。这是低通滤波器的逆运算,显示了当前帧与前一帧加权移动平均之间的差异。这对于运动检测非常有用。
GPUImageMotionDetector:这是一个基于高通滤波器运动检测器。您设置运动检测块,在每个输入帧上,它将给出场景中任何检测到的运动的质心(在归一化X,Y坐标中),以及场景的运动强度。
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》)。
GPUImageLineGenerator: 一个辅助类,用于生成可以叠加到场景中的线条。可以使用 -setLineColorRed:green:blue 调整这些线条的颜色。
GPUImageMotionBlurFilter: 对图像应用方向运动模糊。
GPUImageZoomBlurFilter: 对图像应用方向运动模糊。
GPUImageChromaKeyBlendFilter: 从第一图像中选择性地替换颜色以与第二图像对齐
GPUImageDissolveBlendFilter: 应用两个图像的溶解混合
GPUImageMultiplyBlendFilter: 应用于两个图像的乘法混合
GPUImageAddBlendFilter:应用于两个图像的加法混合
GPUImageSubtractBlendFilter:应用于两个图像的减法混合
GPUImageDivideBlendFilter:应用于两个图像的除法混合
GPUImageOverlayBlendFilter:应用于两个图像的叠加混合
GPUImageDarkenBlendFilter:通过取两个图像之间每个颜色组件的最小值来混合两个图像
GPUImageLightenBlendFilter:通过取两个图像之间每个颜色组件的最大值来混合两个图像
GPUImageColorBurnBlendFilter:应用于两个图像的颜色燃烧混合
GPUImageColorDodgeBlendFilter:应用于两个图像的颜色躲避混合
GPUImageScreenBlendFilter:应用于两个图像的屏幕混合
GPUImageExclusionBlendFilter:应用于两个图像的排除混合
GPUImageDifferenceBlendFilter:应用于两个图像的差异混合
GPUImageHardLightBlendFilter:应用于两个图像的硬光混合
GPUImageSoftLightBlendFilter:应用于两个图像的柔光混合
GPUImageAlphaBlendFilter:根据第二个图像的alpha通道在第一图像上混合第二个图像
GPUImageSourceOverBlendFilter:应用于两个图像的源覆盖混合
GPUImageColorBurnBlendFilter:应用于两个图像的颜色燃烧混合
GPUImageColorDodgeBlendFilter:应用于两个图像的颜色躲避混合
GPUImageNormalBlendFilter:应用于两个图像的正常混合
GPUImageColorBlendFilter:应用于两个图像的颜色混合
GPUImageHueBlendFilter:应用于两个图像的色相混合
GPUImageSaturationBlendFilter:应用于两个图像的饱和度混合
GPUImageLuminosityBlendFilter:应用于两个图像的亮度混合
GPUImageLinearBurnBlendFilter:应用于两个图像的线性燃烧混合
GPUImagePoissonBlendFilter:应用于两个图像的泊松混合
GPUImageMaskFilter:使用另一图像遮罩一个图像
GPUImagePixellateFilter:在图像或视频上应用像素化效果
GPUImagePolarPixellateFilter:根据极坐标而非笛卡尔坐标,对一个图像或视频应用像素化效果
GPUImagePolkaDotFilter:将图像分解为一组在规则网格中的彩色点
GPUImageHalftoneFilter:将图像应用于半色调效果,如新闻印刷
GPUImageCrosshatchFilter:将图像转换为黑白网状图案
GPUImageSketchFilter:将视频转换为类似素描的外观。这仅仅是将 Sobel 边缘检测滤波器与颜色反转结合使用
GPUImageThresholdSketchFilter:与素描滤镜相同,只是边缘被阈值处理而不是灰度处理
GPUImageToonFilter:使用 Sobel 边缘检测来在对象周围放置黑色边框,然后它将图像中出现的颜色量化,以给图像一个卡通般的外观。
GPUImageSmoothToonFilter:使用与 GPUImageToonFilter 相似的过程,但它先应用高斯模糊以平滑噪声,然后再应用卡通效果。
GPUImageEmbossFilter:对图像应用压印效果
GPUImagePosterizeFilter:这减少颜色动态范围到指定的步数,从而导致图像的卡通化简单阴影。
GPUImageSwirlFilter:在图像上创建漩涡扭曲
GPUImageBulgeDistortionFilter:在图像上创建膨胀扭曲
GPUImagePinchDistortionFilter:创建图像的压痕扭曲
GPUImageStretchDistortionFilter:创建图像的拉伸扭曲
GPUImageSphereRefractionFilter:模拟通过玻璃球体的折射
GPUImageGlassSphereFilter:与GPUImageSphereRefractionFilter相同,只是图像没有反转,而且在玻璃边缘有一点点霜状效果
GPUImageVignetteFilter:执行深景效果,边缘图像逐渐变暗
GPUImageKuwaharaFilter:Kuwahara图像抽象,基于Kyprianidis等人发表在GPU Pro专辑中的作品“Anisotropic Kuwahara Filtering on the GPU”。这会产生类似油画的图像,但计算成本极高,因此在iPad 2上渲染一帧可能需要几秒钟。这可能最适合用作静态图片。
GPUImageKuwaharaRadius3Filter:Kuwahara过滤器的修改版,优化以仅在三个像素范围内工作
GPUImagePerlinNoiseFilter:生成充满Perlin噪声的图像
GPUImageCGAColorspaceFilter:模拟CGA显示器的颜色空间
GPUImageMosaicFilter:这个过滤器采用输入瓦片集,瓦片必须是按亮度升序排列的。它查看输入图像,并根据该瓦片的亮度将每个显示屏瓦片替换为输入瓦片。最初的想法是复制其他应用程序中看到的ASCII视频过滤器,但瓦片集可以是任何东西。
GPUImageJFAVoronoiFilter:生成Voronoi图,用于后续阶段。
GPUImageVoronoiConsumerFilter:接收Voronoi图,并使用该图来过滤传入的图像。
您还可以像上面描述的那样使用类似C的OpenGL着色语言轻松编写自己的自定义过滤器。
框架源代码中包含几个示例应用程序。大多数与iPhone和iPad类设备兼容。它们试图展示框架的各种方面,应在框架开发期间使用为API的最佳示例。这包括
在应用程序启动时将一个捆绑的JPEG图像加载到应用程序中,应用过滤器到它,并将结果渲染到屏幕上。此外,这个示例还展示了两种获取图像、过滤它并将其保存到磁盘的方式。
对实时视频流应用像素化过滤器,带有UISlider控件,可让您调整实时视频上的像素大小。
从磁盘加载电影文件,应用锐化蒙版过滤器到它,并将过滤后的结果重新编解码为另一部电影。
从单个摄像头馈送中,四个视图填充了应用于摄像头的实时过滤器。一个是直接摄像头视频,一个是预先编程的棕褐色调,另外两个是基于着色程序的自定义过滤器。
这展示了GPUImage中提供的每个滤镜。
此实验用来测试整个框架的性能,通过与CPU密集型例程和Core Image进行测试。包括静态图像和视频的基准测试针对这三个对象进行,并在应用程序中显示结果。
这演示了GPUImage与OpenGL ES渲染交互的能力。从相机捕获帧,对它们应用深色调滤镜,然后将它们输入到一个纹理中,应用到一个你可以用手指旋转的立方体上。然后,立方体被渲染到一个纹理支持的帧缓冲对象中,该纹理再被馈送回GPUImage,以应用马赛克滤镜并在屏幕上渲染。
换句话说,该应用程序的路径是:相机 -> 深色调滤镜 -> 立方体 -> 马赛克滤镜 -> 显示。
这是从http://www.sunsetlakesoftware.com/2010/10/22/gpu-accelerated-video-processing-mac-and-ios迁移过来的颜色跟踪示例,现在使用GPUImage,该应用使用场景中的颜色跟踪实时相机视频中的对象。您可以切换的四种视图包括原始相机流、与颜色阈值匹配的像素为白色的相机流、经过处理的视频,其中位置被编码为通过阈值测试的像素中的颜色,以及带有跟踪选定颜色的点的实时视频流。轻触屏幕可改变跟踪的颜色的匹配,以与手指下像素的颜色相匹配。轻触并拖动屏幕可以调整颜色阈值,使其更加宽容或严格。这在第二个“颜色阈值”视图中最为明显。
当前,最后一步的颜色平均处理全部在CPU上完成,所以这部分非常慢。