Swift CoreImage Сохранение памяти

Я использую ReactiveCocoa и CoreImage/Video для обработки видео, CoreImage для преобразования и фильтрации каждого CMSampleBuffer из видео и ReactiveCocoa для последовательной обработки буферов.

Моя функция фильтрации довольно проста; все, что я делаю, - это обнаружение лица на заданном изображении и обрезка изображения до границ лица.

static func process(input: CIImage) -> SignalProducer<CIImage?, Types.Error> {
    return SignalProducer { observer, disposable in

            let context = CIContext()

            let detector = CIDetector(ofType: CIDetectorTypeFace, context: context, options: nil)

            guard let firstFeature = detector.featuresInImage(input, options: [CIDetectorImageOrientation: NSNumber(integer: 6)]).first else {
                observer.sendNext(nil)
                observer.sendCompleted()
                return
            }

            let cropFilter = CIFilter(name: "CICrop")
            let cropRect: CIVector = CIVector(CGRect: firstFeature.bounds)

            cropFilter?.setValue(input, forKey: "inputImage")
            cropFilter?.setValue(cropRect, forKey: "inputRectangle")

            guard let output = cropFilter?.outputImage else {
                observer.sendNext(nil)
                observer.sendCompleted()
                return
            }

            observer.sendNext(output)
            observer.sendCompleted()

            disposable.addDisposable {
                cropFilter?.setValue(nil, forKey: "inputImage")
            }
        }

}

Однако где-то в этой функции память непреднамеренно сохраняется. Если я заверну внутренний блок SignalProducer в autoreleasepool Скажите, все работает нормально, и мое использование памяти никогда не превышает 50 МБ. Но если я не заверну свой фильтрующий код в этом, память перепрыгнет с 30 МБ до 200 МБ, тогда приложение вылетает.

Что сохраняется и какая линия вызывает это?

РЕДАКТИРОВАТЬ:

Я обнаружил это вскоре после этой строки:

guard let firstFeature = detector.featuresInImage(input, options: [CIDetectorImageOrientation: NSNumber(integer: 6)]).first else {
    observer.sendNext(nil)
    observer.sendCompleted()
    return
}

Хотя, почему именно эта строка, я понятия не имею. Может ли это быть ошибкой в ​​самом CoreImage?

0 ответов

Другие вопросы по тегам