У меня есть функция обработки живого изображения с использованием 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)
}
}