我已经编写了一个自己的CIFilter内核,它对相机信号进行一些图像处理。它需要两个论点:参数1是"inputImage"(当前相机图像)参数2是"backgroundImage",它正在用第一个相机图像初始化。
过滤器应该递归工作。过滤器的结果应该在下一次迭代中用作新的"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‘prototype’"作为输入添加到新的‘prototype"中。随着时间的推移,渲染的"规则"会变成一个巨大的嵌套原型结构。
有什么方法可以强制CIImages使内存内部的结构变平吗?如果我能做递归处理,我会很高兴,因为这会把QuartzCore的能力发挥到极致。
我在QuartzComposer中也尝试过。将输出与输入连接起来是可行的,但也需要大量内存。一段时间后,它崩溃了。然后我尝试使用QC的队列,一切都很好。QC队列的"xcode"等价物是什么?或者,是否有任何机制可以重写我的内核,以便在内存中为下一次迭代保留"结果"?
您想要的似乎是CIImageAccumulator类。这允许您在下一次迭代中使用过滤器的输出作为其输入。
编辑:
关于如何使用它的示例,您可以查看此Apple示例代码。