GPUImage
有一些过滤器仅适用于来自摄像机的帧流,例如低通滤波器或高通滤波器,但其中有很多滤波器。
我试图创建一个UIImages的缓冲区,使用固定的时间速率使这些过滤器也可以在两个图像之间应用,并且每个图像对都会产生一个过滤图像。类似的东西:
FirstImage + SecondImage - > FirstFilteredImage
SecondImage + ThirdImage - > SecondFilteredImage
我发现,与帧作品过滤器使用GPUImageBuffer
,那就是GPUImageFilter
一个子类(最有可能只是为了继承一些方法和协议)加载一个直通片段着色器。从我所了解的情况来看,这是一个保留传入帧但已经“纹理化”的缓冲区,通过在当前上下文中绑定纹理来生成纹理。
我发现也有一个-conserveMemoryForNextFrame
,这对我想达到的目标来说听起来不错,但我没有得到如何工作。
是否有可能这样做?在哪种方法中图像被转换为纹理?GPUImage将过滤器应用于图像缓冲区
0
A
回答
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];
}
}
相关问题
- 1. 将GPUImage过滤器应用于UIView
- 2. GPUImage对小图像应用过滤器,但显示大图像
- 3. fabricjs将过滤器应用于图像
- 4. 缓冲区和值过滤器
- 5. GPUImage花费时间应用过滤器
- 6. 应用与UISlider GPUImage过滤器
- 7. Android的GPU图像,如何将过滤器应用于图像
- 8. 核心图像过滤器应用于
- 9. xemacs杀死匹配缓冲区或排序/过滤器*缓冲区列表*
- 10. 将图像保存到缓冲区
- 11. 将char *缓冲区显示为图像
- 12. 将图像上传到“缓冲区”
- 13. HTML5图像缓冲区
- 14. 通过uislider和gpuimage过滤器更改图像的亮度
- 15. 如何使用GPUimage将多个滤镜应用于Android中的同一图像?
- 16. GPUImage色度键过滤器
- 17. GPUImage:如何不同的过滤器应用于图像,规模下来,瓦结果输出图像
- 18. OpenCL中的缓冲区对象和图像缓冲区对象
- 19. 如何将过滤器应用于Android ImageLoader加载的图像?
- 20. 将图像过滤器应用于FabricJS中的HTML视频
- 21. 避免内存异常将过滤器应用于图像(Android)
- 22. 如何将butterwoth过滤器应用于图像
- 23. 帧缓冲区320x480缩放图像/ 2 =帧缓冲区640x960不缩放图像?
- 24. 使用linux过滤器程序更改缓冲区文本?
- 25. 将过滤器重新应用于已过滤的JTable视图
- 26. 将图像缓冲区保存为位图图像
- 27. 如何将透明度应用于缓冲图像java
- 28. 用于DMA的快速缓冲存储器缓冲区
- 29. 将过滤器应用于图像时,图像上方的文字被隐藏
- 30. 使用GPUImage过滤视频
为什么不创建这些图像单独GPUImagePicture实例,然后应用双输入滤波器作用于各对图像的? –
感谢品牌,现在我正在看它,它更有意义。我希望稍后发布结果。 – Andrea