【问题标题】:GPUImage capturePhotoAsImageProcessedUpToFilter only working for the last filterGPUImage capturePhotoAsImageProcessedUpToFilter 仅适用于最后一个过滤器
【发布时间】:2014-02-01 23:08:18
【问题描述】:

在我的应用程序中,我使用了一组 3 个滤镜并将其添加到静止相机中。我正在尝试从 filter1 中获取图像,它是一个空过滤器,因此它返回实际图像。

    [stillCamera addTarget:filter1];
[filter1 addTarget:filter2];
[filter2 addTarget:filter3];
[filter3 addTarget:cameraView];

当我调用 capturePhotoAsImageProcessedUpToFilter 时,它只会在我通过 filter3 时返回图像,如下所示。

[stillCamera capturePhotoAsImageProcessedUpToFilter:filter3 with...

以下两个示例从不返回图像

[stillCamera capturePhotoAsImageProcessedUpToFilter:filter1 with...
[stillCamera capturePhotoAsImageProcessedUpToFilter:filter2 with...

我做错了吗?作为修复,我正在使用:

[filter1 imageFromCurrentlyProcessedOutput]

调用 capturePhotoAsImageProcessedUpToFilter 和 imageFromCurrentlyProcessedOutput 有什么区别吗?

【问题讨论】:

    标签: objective-c opencv gpuimage gpuimagestillcamera


    【解决方案1】:

    我认为这是我去年尝试实施的内存保护优化的副作用。对于非常大的图像,比如照片,我尝试做的是在过滤后的图像通过过滤器链时破坏支持每个过滤器的帧缓冲区。我们的想法是尝试通过在任何时间点仅在内存中保存一到两个大图像副本来尽量减少内存峰值。

    不幸的是,这似乎在很多时候都没有按预期工作,并且由于帧缓冲区会随着图像的进行而被删除,因此只有链中的最后一个过滤器最终具有可读取的有效帧缓冲区。我可能会在不久的将来的某个时候取消这种优化,以支持内部帧缓冲区和纹理缓存,但我不确定在此期间可以做什么来从链中的这些中间过滤器中读取。

    【讨论】:

    • 感谢您的回复和出色的框架!似乎您在正常操作期间进行优化是正确的。如果您只在调用 ...ProcessedUpToFilter 和 ...CurrentlyProcessedOutput 类型函数时保留缓冲区,则两全其美的效果可能是可能的。
    • @BradLarson 我使用的是 0.1.6,而我的 stillCamera 只有 1 个滤镜。我将此过滤器与 capturePhotoAsImageProcessedUpToFilter 一起使用,但我得到 nil processedImage
    猜你喜欢
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    • 2013-03-03
    • 2017-02-03
    • 1970-01-01
    相关资源
    最近更新 更多