【发布时间】:2012-10-08 10:55:57
【问题描述】:
我编写了一个自己的 CIFilter 内核,它正在对相机信号进行一些图像处理。它需要两个参数: 参数一是“inputImage”(当前相机图像),参数二是“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”等价物是什么?或者是否有任何机制可以重写我的内核以将“结果”保存在内存中以供下一次迭代使用?
【问题讨论】:
-
我记得几年前曾尝试过类似的事情。最后,我放弃并根据 OpenGL 片段着色器重写了我的相机处理,这使我能够使用后续视频帧进行时间去噪。
-
使用片段着色器是个好主意。不幸的是,这意味着重写大量代码。归根结底,使用 GL 是这样做的更好决定。它为我节省了一些时间来寻找解决方案,并且也可以在 linux 上运行。
标签: cocoa core-image cifilter ciimage