GPUImage文檔翻譯

概述

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上完成的实幕,所以這部分非常慢阱高。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市茬缩,隨后出現(xiàn)的幾起案子赤惊,更是在濱河造成了極大的恐慌,老刑警劉巖凰锡,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件未舟,死亡現(xiàn)場離奇詭異,居然都是意外死亡掂为,警方通過查閱死者的電腦和手機(jī)裕膀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來勇哗,“玉大人昼扛,你說我怎么就攤上這事。” “怎么了抄谐?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵渺鹦,是天一觀的道長。 經(jīng)常有香客問我蛹含,道長毅厚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任浦箱,我火速辦了婚禮吸耿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘酷窥。我一直安慰自己咽安,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布蓬推。 她就那樣靜靜地躺著板乙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拳氢。 梳的紋絲不亂的頭發(fā)上募逞,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機(jī)與錄音馋评,去河邊找鬼放接。 笑死,一個(gè)胖子當(dāng)著我的面吹牛留特,可吹牛的內(nèi)容都是我干的纠脾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼蜕青,長吁一口氣:“原來是場噩夢啊……” “哼苟蹈!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起右核,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤慧脱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后贺喝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體菱鸥,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年躏鱼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了氮采。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡染苛,死狀恐怖鹊漠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤躯概,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布登钥,位于F島的核電站,受9級特大地震影響楞陷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜茉唉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一固蛾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧度陆,春花似錦艾凯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蹬蚁,卻和暖如春恃泪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背犀斋。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工贝乎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人叽粹。 一個(gè)月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓览效,卻偏偏與公主長得像,于是被迫代替她去往敵國和親虫几。 傳聞我的和親對象是個(gè)殘疾皇子锤灿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353