如何递归使用CIFilter的输出作为新输入?

时间:2012-10-08 10:55:58

标签: cocoa core-image cifilter ciimage

我已经编写了一个自己的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”等价物?或者是否有任何机制来重写我的内核以在下一次迭代中将“结果”保留在内存中?

1 个答案:

答案 0 :(得分:2)

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

修改

有关如何使用它的示例,您可以查看this Apple sample code