カメラ信号で画像処理を行う独自の CIFilter カーネルを作成しました。引数 1 は「inputImage」(現在のカメラ画像)、引数 2 は「backgroundImage」で、最初のカメラ画像で初期化されます。
フィルターは再帰的に機能するはずです。フィルタの結果は、次の反復で新しい「backgroundImage」として使用する必要があります。背景画像といくつかの差異を計算しているため、前のレンダリングの結果が必要です。
残念ながら、次の繰り返しでは CIFilter の出力 CIImage を使用できません。これは、メモリの負荷がどんどん高くなるためです。10 秒の処理の後、RAM の使用量は 1.4GB になります。標準的な方法 (再帰なし) でフィルターを使用すると、メモリ管理に問題はありません。
次の反復でフィルターの出力を入力として再利用するにはどうすればよいですか? 結果の画像で 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
}
数秒後、ログは sth になります。お気に入り
}
}
}
}
}
これは、CIImages が目的の操作の「常に」プロトタイプであることを示しています。そして、それらを再帰的に使用すると、新しい「プロトタイプ」への入力として「結果の CIImage 'プロトタイプ'」だけが追加されます。時間が経つにつれて、レンダリングの「ルール」は爆発し、ネストされたプロトタイプの巨大な構造になります。
CIImages を強制的にメモリ内の構造を平坦化する方法はありますか? 再帰的な処理ができれば、QuartzCore のパワーを極限までぶち壊してしまうので嬉しいです。
QuartzComposerでも同じことを試しました。出力を入力に接続すると機能しますが、多くのメモリも必要です。しばらくするとクラッシュします。次に、QC のキューを使用しようとしましたが、すべて正常に機能しました。QC キューに相当する「xcode」とは何ですか? または、カーネルを書き直して、次の反復のために「結果」をメモリに保持するメカニズムはありますか?