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 倍。然而,对于像更大半径的高斯模糊等更复杂的操作,Core Image 目前速度超过了 GPUImage。
BSD 风格,完整的许可可在框架内的 License.txt 中找到。
GPUImage使用OpenGL ES 2.0着色器来执行图像和视频操作,其速度远快于在CPU挂钩程序中可以实现的速度。然而,它通过简化的Objective-C接口隐藏了与OpenGL ES API交互的复杂性。这个接口允许您定义图像和视频的输入源,将过滤器按顺序附加,并将处理后的图像或视频发送到屏幕、UIImage或磁盘上的电影。
图像或视频帧从源对象上传,这些对象是GPUImageOutput的子类。包括GPUImageVideoCamera(用于iOS摄像头的实时视频)、GPUImageStillCamera(用于用相机拍照)、GPUImagePicture(用于静态图像)和GPUImageMovie(用于电影)。源对象将静态图像帧上传到OpenGL ES作为纹理,然后将这些纹理传递给处理链中的下一个对象。
过滤器和其他后续元素遵循GPUImageInput协议,这使得它们可以从链中的前一个链接接收提供的或经过处理的纹理,并对它进行操作。链中更进一步的元素被视为目标,通过向单个输出或过滤器添加多个目标可以实现处理的分支。
例如,一个从摄像头接收实时视频、将视频转换为棕褐色色调,然后显示在屏幕上的应用程序将设置一个类似以下的结构链:
GPUImageVideoCamera -> GPUImageSepiaFilter -> GPUImageView
注意:如果您想在Swift项目中使用此功能,需要使用“添加为框架”部分中的步骤,而不是以下步骤。Swift需要模块以用于第三方代码。
一旦您有了框架的最新源代码,将其添加到您的应用中相对直接。首先,将GPUImage.xcodeproj文件拖放到您的应用Xcode项目中,以将框架嵌入到项目中。接下来,转到您的应用目标,将GPUImage添加为目标依赖项。最后,您需要将GPUImage框架的Products文件夹中的libGPUImage.a库拖放到您应用目标的“与二进制文件链接”构建阶段。
GPUImage还需要将以下框架链接到您的应用中,所以您需要在应用目标中将以下内容添加为链接库:
您还需要找到框架头文件,因此,在项目构建设置中,将“头文件搜索路径”设置为从您的应用到框架/子目录的相对路径,该子目录在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
查看)。
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];
电影只有在完成之后才能使用,因此如果在这一点之前中断,录制将丢失。
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:调整输入图像的透明度通道
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维或3维变换
GPUImageCropFilter:将图像裁剪到特定区域,然后将该区域传递到滤镜的下一阶段
GPUImageLanczosResamplingFilter:允许您使用Lanczos重采样上采样或下采样图像,这比标准的线性或三线性插值质量明显更好。只需使用-forceProcessingAtSize:来设置滤镜的目标输出分辨率,图像将以该新大小进行重采样。
GPUImageSharpenFilter:锐化图像
GPUImageUnsharpMaskFilter:应用不锐化遮罩
GPUImageGaussianBlurFilter:硬件优化的、可变半径的高斯模糊
GPUImageBoxBlurFilter:硬件优化的、可变半径的盒式模糊
GPUImageSingleComponentGaussianBlurFilter:GPUImageGaussianBlurFilter的修改版,仅对红色分量进行操作
GPUImageGaussianSelectiveBlurFilter:高斯模糊,在圆形区域内保留焦点
GPUImageGaussianBlurPositionFilter:GPUImageGaussianSelectiveBlurFilter的逆,仅对特定圆内的图像应用模糊
GPUImageiOSBlurFilter:试图在控制中心等地方重现iOS 7中使用的背景模糊效果。
GPUImageMedianFilter:在3x3区域内取三个颜色分量的中值。
GPUImageBilateralFilter:双曝光模糊,尝试模糊相似的颜色值同时保留清晰的边缘。
GPUImageTiltShiftFilter:模拟倾斜移位镜头效果。
GPUImage3x3ConvolutionFilter:在图像上运行3x3卷积核。
GPUImageSobelEdgeDetectionFilter:索贝尔边缘检测,边缘以白色突出显示。
GPUImagePrewittEdgeDetectionFilter:普雷维特边缘检测,边缘以白色突出显示。
GPUImageThresholdEdgeDetectionFilter:执行索贝尔边缘检测,但应用阈值而不是给出渐变的强度值。
GPUImageCannyEdgeDetectionFilter:使用完整的Canny过程突出显示一像素宽的边缘。
GPUImageHarrisCornerDetectionFilter:在一个输入图像上运行哈里斯角落检测算法,并产生一个以白色像素显示角落点而其余部分为黑色的图像。可以设置cornersDetectedBlock,并将在回调中提供一个角落列表(在归一化的0..1 X,Y坐标中),您可以在该回调中进行任何额外的操作。
GPUImageNobleCornerDetectionFilter:运行Noble变种的Harris角检测器。它具有与上述Harris检测器相同的特性。
GPUImageShiTomasiCornerDetectionFilter:运行Shi-Tomasi特征检测器。它具有与上述Harris检测器相同的特性。
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:将这个滤镜应用到一个视频帧的低通滤波器。这基本是将历史帧的加权滚动平均值与当前帧累积在一起。这可以用来降噪视频、添加运动模糊或创建高通滤波器。
GPUImageHighPassFilter:将一个高通滤波器应用于接收到的视频帧。这是低通滤波器的逆过程,显示了当前帧与先前加权滚动平均值之间的差异。这在运动检测中非常有用。
GPUImageMotionDetector:这是一种基于高通滤波器的运动检测器。您设定motionDetectionBlock,在每帧截图时,它都会为您提供场景中任何检测到的运动的质心(在归一化的X,Y坐标中),以及场景的运动强度。
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)。
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:将视频转换为看起来像素描的效果。这仅仅是索贝尔边缘检测滤波器,并且颜色被反转。
GPUImageThresholdSketchFilter:与素描滤镜相同,只是边缘被阈值化而不是灰度化。
GPUImageToonFilter:使用索贝尔边缘检测在对象周围放置黑色边缘,然后将图像中现有的颜色量化,以便给图像增添卡通般的质感。
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-class设备兼容。它们试图展示框架的各个方面,因此在框架开发过程中应作为API的最佳示例使用。这些包括
在应用程序启动时,将捆绑的JPEG图像加载到应用程序中,对它应用过滤器,并将结果渲染到屏幕上。此外,此样例还展示了两种接受图像、过滤图像并将其保存到磁盘的方法。
将马赛克滤镜应用于实时视频流,并有一个UISlider控件,允许您调整实时视频上的像素大小。
从磁盘加载电影文件,对其应用模糊滤镜,然后将滤镜后的结果重新编码为另一部电影。
来自单个摄像头输入,填充了实时滤镜的应用程序中的四个视图。一个是直接的视频,一个是预先编程的深棕色,另外两个是基于着色程序的定制滤镜。
此示例演示了GPUImage提供的每个过滤器。
此代码用于通过测试CPU密集型例程和核心图像来测试整体框架的性能。涉及静态图像和视频的基准测试运行在这三处,结果在应用程序中显示。
这展示了GPUImage与OpenGL ES渲染交互的能力。从摄像头捕获帧,对这些帧应用深色调滤镜,然后将它们输入到一个纹理中,可用来在你用手指旋转的立方体表面上应用。这个立方体随后被渲染到一个由纹理支持的帧缓冲区对象,然后将这个纹理送回GPUImage,在屏幕渲染之前,应用一个像素化滤镜。
换句话说,这个应用程序的流程是摄像头 -> 深色调滤镜 -> 立方体 -> 像素化滤镜 -> 显示。
这是我从http://www.sunsetlakesoftware.com/2010/10/22/gpu-accelerated-video-processing-mac-and-ios中移植过来的一个ColorTracking示例版本,现在使用GPUImage,这个应用程序使用场景中的颜色来跟踪来自实时摄像头的物体。你可以在这四个视图之间切换:原始摄像头流、白色中匹配颜色阈值的像素的摄像头流、位置编码为像素中颜色的处理视频,以及带有跟踪所选颜色的点的实时视频流。在屏幕上点击会改变要跟踪的颜色来匹配手指下的像素颜色。在屏幕上点击并拖动会使颜色阈值更宽松或更严格。这尤其在第二个,颜色阈值化视图中最为明显。
目前,最后一步中颜色平均的所有处理都是在CPU上进行的,因此这部分非常慢。