2013-12-12 77 views
0

GPUImage有一些過濾器僅適用於來自攝像機的幀流,例如低通濾波器或高通濾波器,但其中有很多濾波器。
我試圖創建一個UIImages的緩衝區,使用固定的時間速率使這些過濾器也可以在兩個圖像之間應用,並且每個圖像對都會產生一個過濾圖像。類似的東西:
FirstImage + SecondImage - > FirstFilteredImage
SecondImage + ThirdImage - > SecondFilteredImage
我發現,與幀作品過濾器使用GPUImageBuffer,那就是GPUImageFilter一個子類(最有可能只是爲了繼承一些方法和協議)加載一個直通片段着色器。從我所瞭解的情況來看,這是一個保留傳入幀但已經「紋理化」的緩衝區,通過在當前上下文中綁定紋理來生成紋理。
我發現也有一個-conserveMemoryForNextFrame,這對我想達到的目標來說聽起來不錯,但我沒有得到如何工作。
是否有可能這樣做?在哪種方法中圖像被轉換爲​​紋理?GPUImage將過濾器應用於圖像緩衝區

+0

爲什麼不創建這些圖像單獨GPUImagePicture實例,然後應用雙輸入濾波器作用於各對圖像的? –

+0

感謝品牌,現在我正在看它,它更有意義。我希望稍後發佈結果。 – Andrea

回答

0

我對我想達到的目標做了一些細緻的處理,但首先我必須說,可能我誤解了有關當前過濾器功能的一些方面。
我認爲一些濾鏡可以使一些操作在着色器中考慮時間變量。這是因爲當我看到低通濾波器和高通濾波器時,我立即想到了時間。現實似乎不同,它們考慮時間,但似乎並不影響過濾操作。
由於我自己開發了一個延時應用程序,它可以保存單個圖像,並將它們重新組合到不同的時間軸上以製作沒有音頻的視頻,我想象過濾器時間函數可能很有趣,適用於後續幀。這就是爲什麼我發佈這個問題的原因。
現在的答案:申請一個雙輸入濾波器仍然必須執行相似圖片的片段:

[sourcePicture1 addTarget:twoinputFilter]; 
    [sourcePicture1 processImage]; 
    [sourcePicture2 addTarget:twoinputFilter]; 
    [sourcePicture2 processImage]; 
    [twoinputFilter useNextFrameForImageCapture]; 
    UIImage * image = [twoinputFilter imageFromCurrentFramebuffer]; 

如果你忘記調用-useNextFrameForImageCapture返回的圖像將是零,由於緩衝重用。
不高興我認爲也許在未來好的布拉德會做出類似這樣的事情,所以我創建了一個GPUImagePicture子類,而不是將KCMTimeIvalid返回給適當的方法,而是返回一個新的包含CMTime的新ivar,名爲-frameTime

@interface GPUImageFrame : GPUImagePicture 
@property (assign, nonatomic) CMTime frameTime; 
@end 

@implementation GPUImageFrame 

- (BOOL)processImageWithCompletionHandler:(void (^)(void))completion; 
{ 
    hasProcessedImage = YES; 

    // dispatch_semaphore_wait(imageUpdateSemaphore, DISPATCH_TIME_FOREVER); 

    if (dispatch_semaphore_wait(imageUpdateSemaphore, DISPATCH_TIME_NOW) != 0) 
    { 
     return NO; 
    } 

    runAsynchronouslyOnVideoProcessingQueue(^{ 
     for (id<GPUImageInput> currentTarget in targets) 
     { 
      NSInteger indexOfObject = [targets indexOfObject:currentTarget]; 
      NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; 

      [currentTarget setCurrentlyReceivingMonochromeInput:NO]; 
      [currentTarget setInputSize:pixelSizeOfImage atIndex:textureIndexOfTarget]; 
      [currentTarget setInputFramebuffer:outputFramebuffer atIndex:textureIndexOfTarget]; 
      [currentTarget newFrameReadyAtTime:_frameTime atIndex:textureIndexOfTarget]; 
     } 

     dispatch_semaphore_signal(imageUpdateSemaphore); 

     if (completion != nil) { 
      completion(); 
     } 
    }); 

    return YES; 
} 

- (void)addTarget:(id<GPUImageInput>)newTarget atTextureLocation:(NSInteger)textureLocation; 
{ 
    [super addTarget:newTarget atTextureLocation:textureLocation]; 

    if (hasProcessedImage) 
    { 
     [newTarget setInputSize:pixelSizeOfImage atIndex:textureLocation]; 
     [newTarget newFrameReadyAtTime:_frameTime atIndex:textureLocation]; 
    } 
} 
相關問題