Почему на iPhone время обработки видеокадра зависит от скорости FPS? - PullRequest
0 голосов
/ 30 апреля 2018

Я снимаю живые видеокадры на 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:

graph

У вас есть какое-нибудь объяснение?

Спасибо.

1 Ответ

0 голосов
/ 01 мая 2018

Может ли iOS масштабировать ресурсы для сохранения заряда батареи / снижения нагрева? Низкая частота может быть адекватной с меньшим количеством процессоров / графических процессоров / ..., но не с более высокими частотами. Несколько поставщиков оружия играли с архитектурой «большой + маленький».

Возможно, вы можете запросить журнал / перфоманс, но если нет, можете ли вы попробовать новые и старые iphone? Я подозреваю, что iphone 8 или 9 более агрессивен, чем 5 или 6. Имейте в виду, что fix для внезапного разряда батареи может помешать вашему эксперименту на этих устройствах.

...