0

我编写了一个自己的 CIFilter 内核,它正在对相机信号进行一些图像处理。它需要两个参数:参数一个是“inputImage”(当前相机图像),参数 2 是“backgroundImage”,它正在使用第一个相机图像进行初始化。

过滤器应该递归工作。过滤器的结果应在下一次迭代中用作新的“背景图像”。我正在计算背景图像和一些差异,因此需要上一次渲染的结果。

不幸的是,我不能在下一次迭代中使用 CIFilter 的输出 CIImage,因为内存负载越来越大。经过 10 秒的处理后,最终使用了 1.4GB 的 RAM。以标准方式(无递归)内存管理使用过滤器很好。

如何在下一次迭代中重用过滤器的输出作为输入?我在结果图像上做了一个 NSLog。蚂蚁告诉我

background {

CISampler:0x1002e0360 image {                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
   FEPromise: 0x1013aa230 extent [0 0 1280 720]; DOD [0 0 1280 720]; filter MyFeatureDetectFilter: 0x101388dd0; kernel coreImageKernel; image {

CISampler:0x10139e200 image {                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
   FEBufferImage: 0x10139bee0 metadata.colorspace: HDTV; extent: [0 0 1280 720]; format: BGRA_8; uid 5                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
}

几秒钟后,日志变成了某事。像

                            }                                                                                                                                                            
                         }                                                                                                                                                     
                       }                                                                                                                                                                                 
                     }                                                                                                                                                    
                   }                                                                                                                                                       

这告诉我 CIImages 是所需操作的“始终”原型。并且递归地使用它们将“生成的 CIImage '原型'”作为输入添加到新的“原型”中。随着时间的推移,渲染的“规则”变成了一个巨大的嵌套原型结构。

有什么方法可以强制 CIImages 将内存中的结构变平?如果我可以进行递归处理,我会很高兴,因为这会将 QuartzCore 的功能发挥到极致。

我在 QuartzComposer 中尝试了同样的方法。将输出与输入连接是可行的,但也会占用大量内存。一段时间后它崩溃了。然后我尝试使用 QC 的队列,一切正常。QC 队列的“xcode”等价物是什么?或者是否有任何机制可以重写我的内核以将“结果”保存在内存中以供下一次迭代使用?

4

1 回答 1

2

您正在寻找的似乎是CIImageAccumulator 类。这允许您在下一次迭代中使用过滤器的输出作为其输入。

编辑:

有关如何使用它的示例,您可以查看此 Apple 示例代码

于 2014-08-04T21:28:06.393 回答