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