【问题标题】:How to use output of CIFilter recursively as new input?如何递归地使用 CIFilter 的输出作为新的输入?
【发布时间】: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


【解决方案1】:

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

编辑:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 2020-02-18
    相关资源
    最近更新 更多