Как я могу извлечь только один кадр в секунду из CMSampleBuffer для дальнейшей обработки в реальном времени - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть функция обработки живого изображения с использованием openCV, которая требует времени обработки, поэтому при 15 или 30 кадрах в секунду мое приложение вылетает или зависает.Мне удалось заставить это работать, уменьшив количество кадров в секунду с помощью этого кода:

device.activeVideoMinFrameDuration = CMTimeMake(1, 5)

Однако вывод видео сейчас очень прерывистый.Я предпочел бы сохранить выходной видеосигнал со скоростью 15 кадров в секунду и извлекать, скажем, только каждый третий кадр для обработки в реальном времени (что является наложением на видеовыход - он показывает контур).Как я могу это сделать?Вот текущий код:

func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!,
                   from connection: AVCaptureConnection!) {

    imageFromBuffer = CameraUtil.imageFromSampleBuffer(buffer: sampleBuffer)

    //// I have a number of openCV image processing functions 
    //// here in order to be able to show the live contour overlay to the camera output. 
}

Способ получения изображений из CMSampleBuffer:

class CameraUtil {

class func imageFromSampleBuffer(buffer: CMSampleBuffer) -> UIImage {

    let pixelBuffer: CVImageBuffer = CMSampleBufferGetImageBuffer(buffer)!

    let ciImage = CIImage(cvPixelBuffer: pixelBuffer)

    let pixelBufferWidth = CGFloat(CVPixelBufferGetWidth(pixelBuffer))
    let pixelBufferHeight = CGFloat(CVPixelBufferGetHeight(pixelBuffer))

    //// set size of output window   /////////
    let imageRect: CGRect = CGRectMake(0, 0, pixelBufferWidth, pixelBufferHeight/2)  ///change camera output display window


    let ciContext = CIContext.init()
    let cgimage = ciContext.createCGImage(ciImage, from: imageRect )

    let image = UIImage(cgImage: cgimage!)
    return image
}

class func CGRectMake(_ x: CGFloat, _ y: CGFloat, _ width: CGFloat, _ height: CGFloat) -> CGRect {
    return CGRect(x: x, y: y, width: width, height: height)
}

}
...