概述
GPUImage框架是一個(gè)獲得bsd許可的iOS庫族操,允許您對圖像面睛、實(shí)時(shí)攝像機(jī)視頻和電影應(yīng)用gpu加速過濾器和其他效果。與Core Image (iOS 5.0的一部分)相比酪惭,GPUImage允許您編寫自己的自定義過濾器沪饺,支持iOS 4.0的部署,并且具有更簡單的界面商佛。然而喉钢,它目前缺少核心圖像的一些更高級的功能,比如面部檢測良姆。
對于處理圖像或視頻幀的大規(guī)模并行操作肠虽,gpu比cpu有一些顯著的性能優(yōu)勢。在iPhone 4上玛追,一個(gè)簡單的圖像過濾器在GPU上的運(yùn)行速度比一個(gè)同等的基于cpu的過濾器快100倍舔痕。
然而,在GPU上運(yùn)行自定義過濾器需要很多代碼來設(shè)置和維護(hù)這些過濾器的OpenGL ES 2.0呈現(xiàn)目標(biāo)豹缀。為此,我創(chuàng)建了一個(gè)示例項(xiàng)目:
http://www.sunsetlakesoftware.com/2010/10/22/gpu-accelerated-video-processing-mac-and-ios
我發(fā)現(xiàn)在它的創(chuàng)建過程中有很多樣板代碼慨代。因此邢笙,我將這個(gè)框架放在一起,它封裝了處理圖像和視頻時(shí)將遇到的許多常見任務(wù)侍匙,并使其不需要關(guān)心OpenGL ES 2.0的基礎(chǔ)氮惯。
在處理視頻時(shí),這個(gè)框架比Core Image要好想暗,在iPhone 4上只需要2.5毫秒就可以從攝像頭上傳一幀圖像妇汗,應(yīng)用gamma filter,然后顯示说莫,而在同樣的操作中使用Core Image只需要106毫秒杨箭。基于cpu的處理需要460毫秒储狭,這使得GPUImage比Core Image快40倍互婿,比cpu綁定的處理快184倍。在iPhone 4S上辽狈,GPUImage僅比Core Image快4倍慈参,比cpu綁定處理快102X倍。然而刮萌,對于更復(fù)雜的操作驮配,如高斯模糊在較大的半徑,核心圖像目前超過GPUImage。
許可證
bsd風(fēng)格壮锻,在license .txt中有完整的許可框架琐旁。
技術(shù)要求
OpenGL ES 2.0:使用這種技術(shù)的應(yīng)用程序不會在最初的iPhone、iPhone 3G和第一代和第二代iPod touch上運(yùn)行
iOS 4.1作為部署目標(biāo)(4.0不需要一些擴(kuò)展來閱讀電影)躯保。如果想在拍攝靜態(tài)照片時(shí)顯示實(shí)時(shí)視頻預(yù)覽旋膳,需要將iOS 4.3作為部署目標(biāo)。
iOS 5.0 SDK構(gòu)建
設(shè)備必須有攝像頭才能使用與攝像頭相關(guān)的功能(顯然)
該框架使用自動引用計(jì)數(shù)(ARC)途事,但如果添加為子項(xiàng)目验懊,則應(yīng)支持使用ARC和手動引用計(jì)數(shù)的項(xiàng)目,如下所述尸变。用于針對iOS 4的手動引用計(jì)數(shù)應(yīng)用程序义图。x,您需要將-fobjc-arc添加到應(yīng)用程序項(xiàng)目的其他鏈接標(biāo)志召烂。
總體架構(gòu)
GPUImage使用OpenGL ES 2.0著色器來執(zhí)行圖像和視頻操作碱工,比cpu綁定例程快得多。但是奏夫,它隱藏了在一個(gè)簡化的Objective-C接口中與OpenGL ES API交互的復(fù)雜性怕篷。這個(gè)接口允許您為圖像和視頻定義輸入源,在鏈中附加過濾器酗昼,并將結(jié)果處理后的圖像或視頻發(fā)送到屏幕廊谓、UIImage或磁盤上的電影。
視頻的圖像或幀是從源對象上傳的麻削,源對象是GPUImageOutput的子類蒸痹。其中包括GPUImageVideoCamera(用于iOS攝像機(jī)的實(shí)時(shí)視頻)、GPUImageStillCamera(用于相機(jī)拍照)呛哟、GPUImagePicture(用于靜態(tài)圖像)和GPUImageMovie(用于電影)叠荠。源對象將靜態(tài)圖像幀作為紋理上傳到OpenGL ES,然后將這些紋理傳遞給處理鏈中的下一個(gè)對象扫责。
過濾器和鏈中的其他后續(xù)元素符合GPUImageInput協(xié)議榛鼎,該協(xié)議允許它們從鏈中的前一個(gè)鏈接中獲取提供的或經(jīng)過處理的紋理并對其進(jìn)行處理。再往下走一步的對象被認(rèn)為是目標(biāo)鳖孤,通過向單個(gè)輸出或過濾器添加多個(gè)目標(biāo)借帘,可以對處理進(jìn)行分支。
例如淌铐,一個(gè)應(yīng)用程序從攝像頭獲取實(shí)時(shí)視頻肺然,將視頻轉(zhuǎn)換為深褐色色調(diào),然后將視頻顯示在屏幕上腿准,它會建立一個(gè)鏈际起,看起來像這樣:
GPUImageVideoCamera -> GPUImageSepiaFilter -> GPUImageView
將靜態(tài)庫添加到iOS項(xiàng)目中
注意:如果您想在Swift項(xiàng)目中使用這個(gè)拾碌,您需要使用“Adding this as a framework”部分中的步驟,而不是以下步驟街望。Swift需要第三方代碼模塊校翔。
有了框架的最新源代碼后,將其添加到應(yīng)用程序中就相當(dāng)簡單了灾前。從拖動GPUImage開始防症。在應(yīng)用程序的Xcode項(xiàng)目中嵌入框架。接下來哎甲,轉(zhuǎn)到應(yīng)用程序的目標(biāo)蔫敲,并將GPUImage添加為目標(biāo)依賴項(xiàng)。最后炭玫,需要拖動libGPUImage奈嘿。從GPUImage框架的Products文件夾到鏈接二進(jìn)制與庫的應(yīng)用程序目標(biāo)構(gòu)建階段的庫。
GPUImage需要一些其他框架鏈接到您的應(yīng)用程序中吞加,因此您需要在您的應(yīng)用程序目標(biāo)中添加以下鏈接庫:
CoreMedia
CoreVideo
OpenGLES
AVFoundation
QuartzCore
您還需要找到框架標(biāo)頭裙犹,因此在項(xiàng)目的構(gòu)建設(shè)置中,要將標(biāo)頭搜索路徑設(shè)置為從應(yīng)用程序到GPUImage源目錄中的框架/子目錄的相對路徑衔憨。使這個(gè)頭搜索路徑遞歸叶圃。
要在應(yīng)用程序中使用GPUImage類,只需使用以下方法包括核心框架頭:
#import "GPUImage.h"
注意:如果您在嘗試使用Interface Builder構(gòu)建接口時(shí)遇到“未知類GPUImageView在Interface Builder中”之類的錯(cuò)誤践图,那么您可能需要在項(xiàng)目的構(gòu)建設(shè)置中向其他鏈接器標(biāo)記添加-ObjC掺冠。
另外,如果您需要將其部署到iOS 4中平项。x,看來Xcode的當(dāng)前版本(4.3)要求您在最終應(yīng)用程序中弱鏈接核心視頻框架悍及,或者在創(chuàng)建用于上傳到應(yīng)用程序商店或特別發(fā)布的存檔時(shí)闽瓢,看到“符號未找到:_CVOpenGLESTextureCacheCreate”的消息崩潰。要做到這一點(diǎn)心赶,請轉(zhuǎn)到您的項(xiàng)目的構(gòu)建階段選項(xiàng)卡扣讼,使用庫組展開鏈接二進(jìn)制文件,并在列表中找到corevido .framework缨叫。將列表最右側(cè)的設(shè)置從Required更改為Optional椭符。
此外,這是一個(gè)支持arc的框架耻姥,所以如果你想在面向iOS 4的手動引用計(jì)數(shù)應(yīng)用程序中使用它销钝。x,還需要將-fobjc-arc添加到其他鏈接器標(biāo)志中琐簇。
在命令行中構(gòu)建靜態(tài)庫
如果不希望將項(xiàng)目作為依賴項(xiàng)包含在應(yīng)用程序的Xcode項(xiàng)目中蒸健,可以為iOS模擬器或設(shè)備構(gòu)建通用靜態(tài)庫座享。要做到這一點(diǎn),運(yùn)行build似忧。命令行渣叛。生成的庫和頭文件將位于build/Release-iphone上。您還可以通過更改構(gòu)建中的IOSSDK_VER變量來更改iOS SDK的版本盯捌。sh(可以使用xcodebuild -showsdks找到所有可用的版本)淳衙。
將其作為框架(模塊)添加到Mac或iOS項(xiàng)目中
Xcode 6和iOS 8支持完整框架的使用,Mac也是如此饺著,這簡化了向應(yīng)用程序添加這個(gè)框架的過程箫攀。要將其添加到應(yīng)用程序中,我建議將.xcodeproj項(xiàng)目文件拖放到應(yīng)用程序的項(xiàng)目中(就像在靜態(tài)庫目標(biāo)中那樣)瓶籽。
對于您的應(yīng)用程序匠童,轉(zhuǎn)到它的目標(biāo)構(gòu)建設(shè)置并選擇構(gòu)建階段選項(xiàng)卡。在目標(biāo)依賴項(xiàng)分組下塑顺,在iOS上添加GPUImageFramework(不是構(gòu)建靜態(tài)庫的GPUImage)或在Mac上添加GPUImage汤求。
這將導(dǎo)致GPUImage作為框架構(gòu)建。在Xcode 6中严拒,這也將作為一個(gè)模塊構(gòu)建扬绪,允許您在Swift項(xiàng)目中使用它。在如上所述設(shè)置時(shí)裤唠,您只需使用
import GPUImage
即可挤牛。
然后,您需要添加一個(gè)新的復(fù)制文件構(gòu)建階段种蘸,將目標(biāo)設(shè)置為框架墓赴,并為此添加GPUImage.framework構(gòu)建產(chǎn)品。這將允許框架與您的應(yīng)用程序捆綁在一起(否則航瞭,您將看到“dyld: Library not loaded: @rpath/GPUImage.framework/GPUImage”執(zhí)行錯(cuò)誤)诫硕。
文檔
文檔是使用appledoc從標(biāo)題注釋中生成的。要構(gòu)建文檔刊侯,請切換到Xcode中的“文檔”模式章办。您應(yīng)該確保“APPLEDOC_PATH”(用戶定義的構(gòu)建設(shè)置)指向appledoc二進(jìn)制文件滨彻,可以在Github上使用藕届,也可以通過Homebrew使用。它還將構(gòu)建和安裝一個(gè).docset文件亭饵,您可以使用自己喜歡的文檔工具查看該文件休偶。
執(zhí)行常見任務(wù)
過濾視頻直播
要從iOS設(shè)備的攝像頭中過濾實(shí)時(shí)視頻,可以使用以下代碼:
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];
這就設(shè)置了一個(gè)來自iOS設(shè)備背對攝像頭的視頻源辜羊,使用了一個(gè)預(yù)置椅贱,試圖捕捉640x480像素懂算。這段視頻是在豎屏模式下拍攝的,左置景觀攝像頭需要旋轉(zhuǎn)其視頻幀才能顯示庇麦。一個(gè)自定義過濾器计技,使用來自文件CustomShader的代碼。然后將fsh設(shè)置為攝像機(jī)的視頻幀的目標(biāo)山橄。這些經(jīng)過過濾的視頻幀最終在UIView子類的幫助下顯示在屏幕上垮媒,這個(gè)UIView子類可以顯示這個(gè)管道產(chǎn)生的經(jīng)過過濾的OpenGL ES紋理。
GPUImageView的填充模式可以通過設(shè)置它的fillMode屬性來改變航棱,這樣如果源視頻的長寬比與視圖不同睡雇,視頻要么被拉伸,以黑色條為中心饮醇,要么被縮放以填充它抱。
對于混合過濾器和接受多個(gè)圖像的其他過濾器,您可以創(chuàng)建多個(gè)輸出并添加一個(gè)過濾器作為這兩個(gè)輸出的目標(biāo)朴艰。作為目標(biāo)添加輸出的順序?qū)⒂绊戄斎雸D像混合或以其他方式處理的順序观蓄。
另外,如果你想讓麥克風(fēng)的音頻捕捉記錄到電影祠墅,你需要把攝像機(jī)的audioEncodingTarget設(shè)置為你的電影編劇侮穿,比如:
videoCamera.audioEncodingTarget = movieWriter;
捕捉和過濾靜止照片
要捕獲和過濾靜態(tài)照片,可以使用類似于過濾視頻的過程毁嗦。你用的不是GPUImageVideoCamera亲茅,而是GPUImageStillCamera:
stillCamera = [[GPUImageStillCamera alloc] init];
stillCamera.outputImageOrientation = UIInterfaceOrientationPortrait;
filter = [[GPUImageGammaFilter alloc] init];
[stillCamera addTarget:filter];
GPUImageView *filterView = (GPUImageView *)self.view;
[filter addTarget:filterView];
[stillCamera startCameraCapture];
這將給你一個(gè)實(shí)時(shí)的,過濾后的靜止攝像頭的預(yù)覽視頻狗准。請注意克锣,這個(gè)預(yù)覽視頻僅在iOS 4.3及更高版本上提供,因此如果您希望具有此功能腔长,可能需要將其設(shè)置為部署目標(biāo)袭祟。
一旦你想要捕捉照片,你使用一個(gè)回調(diào)塊如下:
[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;
? ? }
}];
上面的代碼捕獲了由preview視圖中使用的相同篩選器鏈處理的全尺寸照片饼酿,并將該照片作為JPEG保存在應(yīng)用程序的documents目錄中榕酒。
請注意胚膊,由于紋理大小的限制故俐,該框架目前無法處理超過2048像素寬或高的舊設(shè)備(iPhone 4S、iPad 2或Retina iPad之前的設(shè)備)上的圖像紊婉。這意味著药版,iPhone 4的攝像頭輸出的照片仍然比這大,無法捕捉到這樣的照片喻犁。目前正在實(shí)施一種平鋪機(jī)制來解決這個(gè)問題槽片。所有其他設(shè)備都應(yīng)該能夠使用這種方法捕獲和過濾照片何缓。
處理靜態(tài)圖像
有幾種方法可以處理靜態(tài)圖像并創(chuàng)建結(jié)果。第一種方法是創(chuàng)建一個(gè)靜態(tài)圖像源對象并手動創(chuàng)建一個(gè)過濾器鏈:
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];
注意还栓,要手動從過濾器捕獲圖像碌廓,您需要設(shè)置-useNextFrameForImageCapture,以便告訴過濾器稍后需要從它捕獲圖像剩盒。默認(rèn)情況下谷婆,GPUImage在過濾器中重用framebuffer來保存內(nèi)存,所以如果您需要保存過濾器的framebuffer以進(jìn)行手動圖像捕獲辽聊,您需要提前讓它知道纪挎。
對于您希望應(yīng)用于圖像的單個(gè)過濾器,您可以簡單地執(zhí)行以下操作:
GPUImageSepiaFilter *stillImageFilter2 = [[GPUImageSepiaFilter alloc] init];
UIImage *quickFilteredImage = [stillImageFilter2 imageByFilteringImage:inputImage];
編寫一個(gè)自定義的過濾器
與iOS上的核心映像相比跟匆,這個(gè)框架的一個(gè)顯著優(yōu)點(diǎn)是能夠編寫自己的自定義映像和視頻處理過濾器异袄。這些過濾器作為OpenGL ES 2.0片段著色器提供,用類似c的OpenGL著色語言編寫玛臂。
使用如下代碼初始化自定義篩選器
GPUImageFilter *customFilter = [[GPUImageFilter alloc] initWithFragmentShaderFromFile:@"CustomShader"];
用于片段著色器的擴(kuò)展名為.fsh烤蜕。另外,如果您不想在應(yīng)用程序包中發(fā)布片段著色器垢揩,可以使用-initWithFragmentShaderFromString: initializer將片段著色器作為字符串提供玖绿。
片段著色器對要在該篩選階段呈現(xiàn)的每個(gè)像素執(zhí)行計(jì)算。他們使用OpenGL Shading Language (GLSL)來做到這一點(diǎn)叁巨,這是一種類似于c語言的語言斑匪,添加了特定于2d和3d圖形。片段著色器的一個(gè)例子是:
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變化(對于紋理內(nèi)的當(dāng)前坐標(biāo)蚀瘸,歸一化到1.0)和inputImageTexture uniform(對于實(shí)際輸入的圖像幀紋理)。
著色器的其余部分在傳入紋理的這個(gè)位置抓取像素的顏色庶橱,以產(chǎn)生深褐色色調(diào)的方式操作它贮勃,并將像素顏色寫出來,以便在處理管道的下一階段使用苏章。
在Xcode項(xiàng)目中添加片段著色器時(shí)需要注意的一點(diǎn)是寂嘉,Xcode認(rèn)為它們是源代碼文件。為了解決這個(gè)問題枫绅,您需要手動將著色器從編譯源構(gòu)建階段移動到復(fù)制包資源階段泉孩,以便將著色器包含到應(yīng)用程序包中。
過濾和重新編碼一個(gè)電影
電影可以通過GPUImageMovie類加載到框架中并淋,過濾寓搬,然后使用GPUImageMovieWriter寫出。GPUImageMovieWriter的速度也足夠快县耽,可以在640x480英寸的iPhone 4相機(jī)上實(shí)時(shí)錄制視頻句喷,因此可以直接將經(jīng)過過濾的視頻源輸入其中镣典。目前,GPUImageMovieWriter的速度足以在iPhone 4上以高達(dá)20幀/秒的速度錄制720p的視頻唾琼,在iPhone 4S上(以及在新iPad上)以30幀/秒的速度錄制720p和1080p的視頻兄春。
下面是一個(gè)示例,演示如何加載示例影片锡溯,將其通過像素化過濾器傳遞神郊,然后將結(jié)果以480x640的速度記錄到磁盤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];
錄制完成后,您需要從過濾鏈中刪除影片記錄器趾唱,并使用如下代碼關(guān)閉錄制:
[pixellateFilter removeTarget:movieWriter];
[movieWriter finishRecording];
電影在結(jié)束之前是不能用的涌乳,所以如果在這之前中斷了,影片就會丟失甜癞。
與OpenGL ES交互
GPUImage可以通過分別使用其GPUImageTextureOutput和GPUImageTextureInput類從OpenGL ES導(dǎo)出和導(dǎo)入紋理夕晓。這允許您從OpenGL ES場景中錄制電影,該場景通過綁定紋理呈現(xiàn)到framebuffer對象悠咱,或過濾視頻或圖像蒸辆,然后將它們作為紋理輸入到OpenGL ES中以顯示在場景中。
這種方法的一個(gè)警告是析既,在這些過程中使用的紋理必須通過共享組或類似的方式在GPUImage的OpenGL ES上下文和任何其他上下文之間共享躬贡。
示例應(yīng)用程序
幾個(gè)示例應(yīng)用程序與框架源代碼捆綁在一起。大多數(shù)都兼容iPhone和ipad級設(shè)備眼坏。它們試圖展示框架的各個(gè)方面拂玻,并應(yīng)該在框架開發(fā)期間作為API的最佳示例使用。這些包括:
SimpleImageFilter
在啟動時(shí)將綁定的JPEG圖像加載到應(yīng)用程序中宰译,對其應(yīng)用過濾器檐蚜,并將結(jié)果呈現(xiàn)到屏幕上。此外沿侈,本示例還展示了兩種方法闯第,分別是獲取圖像、對其進(jìn)行過濾和將其保存到磁盤缀拭。
SimpleVideoFilter
一個(gè)像素過濾器被應(yīng)用到實(shí)時(shí)視頻流中咳短,帶有UISlider控件,允許您調(diào)整實(shí)時(shí)視頻的像素大小蛛淋。
SimpleVideoFileFilter
從磁盤加載一個(gè)電影文件咙好,對其應(yīng)用一個(gè)不清晰的掩碼過濾器,過濾后的結(jié)果被重新編碼為另一個(gè)電影铣鹏。
MultiViewFilterExample
從一個(gè)攝像機(jī)提要敷扫,4個(gè)視圖被應(yīng)用到攝像機(jī)上的實(shí)時(shí)過濾器填充哀蘑。一個(gè)是直接拍攝的視頻诚卸,一個(gè)是預(yù)編程的深褐色調(diào)葵第,兩個(gè)是基于著色程序的自定義濾鏡。
FilterShowcase
這演示了GPUImage提供的每個(gè)過濾器合溺。
BenchmarkSuite
這是通過對cpu綁定例程和核心映像進(jìn)行測試來測試整個(gè)框架的性能的卒密。涉及靜態(tài)圖像和視頻的基準(zhǔn)測試是針對這三種方法運(yùn)行的,結(jié)果顯示在應(yīng)用程序中棠赛。
CubeExample
這證明了GPUImage與OpenGL ES渲染的交互能力哮奇。鏡框從相機(jī)上捕捉下來,然后用一個(gè)烏賊濾鏡對它們進(jìn)行處理睛约,然后把它們放入一個(gè)紋理中鼎俘,然后應(yīng)用到一個(gè)可以用手指旋轉(zhuǎn)的立方體的表面。這個(gè)立方體依次被渲染到一個(gè)有紋理支持的framebuffer對象中辩涝,然后這個(gè)紋理被反饋回GPUImage贸伐,在渲染到屏幕之前應(yīng)用一個(gè)像素化過濾器。
換句話說怔揩,這個(gè)應(yīng)用的路徑是camera -> sepia tone filter -> cube -> pixellation filter -> display捉邢。
ColorObjectTracking
我在http://www.sunsetlakesoftware.com/2010/10/22/gpu- accelerator -video-processing-mac- ios中移植了一個(gè)使用GPUImage的顏色跟蹤示例,這個(gè)應(yīng)用程序在場景中使用顏色來從實(shí)時(shí)攝像機(jī)提要跟蹤對象商膊。四個(gè)視圖之間切換可以包括原始相機(jī)飼料,相機(jī)飼料白色像素匹配顏色閾值,處理視頻編碼的位置在哪里的顏色在像素通過閾值測試,最后點(diǎn)的視頻實(shí)時(shí)跟蹤選定的顏色伏伐。輕觸屏幕可更改顏色以跟蹤匹配手指下像素的顏色。在屏幕上點(diǎn)擊和拖動使顏色閾值或多或少得到了原諒晕拆。這在第二種顏色閾值視圖上最明顯藐翎。
目前,最后一步中顏色平均的所有處理都是在CPU上完成的实幕,所以這部分非常慢阱高。