我已经编写了一个自己的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'原型'”作为新“原型”的输入。 随着时间的推移,渲染的“规则”会爆炸成一个巨大的嵌套原型结构。
有没有办法强迫CIImages压缩内存中的结构? 如果我可以进行递归处理,我会很高兴,因为这会将QuartzCore的功能发挥到极致。
我在QuartzComposer中尝试过相同的操作。将输出与输入连接起作用,但也会占用大量内存。一段时间后它崩溃了。然后我尝试使用QC的Queue,一切正常。什么是QC队列的“xcode”等价物?或者是否有任何机制来重写我的内核以在下一次迭代中将“结果”保留在内存中?
答案 0 :(得分:2)
您正在寻找的是CIImageAccumulator class。这允许您在下一次迭代时使用过滤器的输出作为其输入。
修改强>
有关如何使用它的示例,您可以查看this Apple sample code。