Я снимаю живые видеокадры на iPhone и обрабатываю их для отслеживания в режиме реального времени с использованием OpenCV. Стремясь минимизировать время обработки, я обнаружил, что чистое время обработки кадров зависит от заданной скорости FPS! Я ожидал бы, что время обработки изображения в модуле OpenCV будет зависеть только от размера изображения и самого алгоритма OpenCV, не так ли?
setupCaptureSession:
- (void)setupCaptureSession
{
if ( _captureSession )
{
return;
}
_captureSession = [[AVCaptureSession alloc] init];
videoPreviewLayer = [AVCaptureVideoPreviewLayer layerWithSession:_captureSession];
AVCaptureDevice *videoDevice = [self frontCamera];
NSError *videoDeviceError = nil;
AVCaptureDeviceInput *videoIn = [[AVCaptureDeviceInput alloc] initWithDevice:videoDevice error:&videoDeviceError];
if ( [_captureSession canAddInput:videoIn] )
{
[_captureSession addInput:videoIn];
_videoDevice = videoDevice;
}
else
{
[self handleNonRecoverableCaptureSessionRuntimeError:videoDeviceError];
return;
}
AVCaptureVideoDataOutput *videoOut = [[AVCaptureVideoDataOutput alloc] init];
videoOut.videoSettings = [NSDictionary dictionaryWithObject:
[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey];
[videoOut setSampleBufferDelegate:self queue:_videoDataOutputQueue];
videoOut.alwaysDiscardsLateVideoFrames = NO;
if ( [_captureSession canAddOutput:videoOut] )
{
[_captureSession addOutput:videoOut];
}
_videoConnection = [videoOut connectionWithMediaType:AVMediaTypeVideo];
_videoBufferOrientation = _videoConnection.videoOrientation;
[self configureCameraForFrameRate : videoDevice];
return;
}
captureOutput:
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection (AVCaptureConnection *)connection
{
UIImage *sourceUIImage = [self imageFromSampleBuffer : sampleBuffer];
CMFormatDescriptionRef formatDescription = CMSampleBufferGetFormatDescription( sampleBuffer );
if ( self.outputVideoFormatDescription == NULL )
{
[self setupVideoPipelineWithInputFormatDescription:formatDescription];
}
else
{
processedFrameNumber++;
@synchronized( _renderer )
{
[_renderer processImageWithOpenCV : sourceUIImage : processingData];
}
}
}
В начале и в конце процесса размещаются изображения ImageWithOpenCV соответственно:
timeBeforeProcess = [NSDate timeIntervalSinceReferenceDate];
и
timeAfterProcess = [NSDate timeIntervalSinceReferenceDate];
Для значений FPS 20, 30, 40 и 60 я измерил соответственно следующие значения времени обработки кадра в мс 0,0140, 0,0089, 0,0074 и 0,0072.
Для иллюстрации этот график показывает, как время обработки кадров уменьшается с FPS:
У вас есть какое-нибудь объяснение?
Спасибо.