2013-12-12 36 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]; 
    } 
} 
相关问题