如何在低分辨率的 iPhone 6 上获得 240fps

Posted

技术标签:

【中文标题】如何在低分辨率的 iPhone 6 上获得 240fps【英文标题】:How to get 240fps on iPhone 6 with low resolution 【发布时间】:2015-03-12 21:05:29 【问题描述】:

我正在尝试使用 iPhone 6 以 240fps 进行实时图像处理。问题是当我以这种速度捕获视频时,我无法足够快地处理图像,因为我需要对每个像素进行采样以获得平均值。降低图像分辨率很容易解决这个问题,但我无法弄清楚如何做到这一点。可用的 AVCaptureDeviceFormat 具有 192x144 像素的选项,但为 30fps。所有 240fps 选项都具有更大的尺寸。以下是我对数据进行采样的方式:

- (void)startDetection

    const int FRAMES_PER_SECOND = 240;
    self.session = [[AVCaptureSession alloc] init];
    self.session.sessionPreset = AVCaptureSessionPresetLow;

    // Retrieve the back camera
    NSArray *devices = [AVCaptureDevice devices];
    AVCaptureDevice *captureDevice;
    for (AVCaptureDevice *device in devices)
    
        if ([device hasMediaType:AVMediaTypeVideo])
        
            if (device.position == AVCaptureDevicePositionBack)
            
                captureDevice = device;
                break;
            
        
    

    NSError *error;
    AVCaptureDeviceInput *input = [[AVCaptureDeviceInput alloc] initWithDevice:captureDevice error:&error];
    [self.session addInput:input];

    if (error)
    
        NSLog(@"%@", error);
    

    // Find the max frame rate we can get from the given device
    AVCaptureDeviceFormat *currentFormat;
    for (AVCaptureDeviceFormat *format in captureDevice.formats)
    
        NSArray *ranges = format.videoSupportedFrameRateRanges;
        AVFrameRateRange *frameRates = ranges[0];

        // Find the lowest resolution format at the frame rate we want.
        if (frameRates.maxFrameRate == FRAMES_PER_SECOND && (!currentFormat || (CMVideoFormatDescriptionGetDimensions(format.formatDescription).width < CMVideoFormatDescriptionGetDimensions(currentFormat.formatDescription).width && CMVideoFormatDescriptionGetDimensions(format.formatDescription).height < CMVideoFormatDescriptionGetDimensions(currentFormat.formatDescription).height)))
        
            currentFormat = format;
        
    

    // Tell the device to use the max frame rate.
    [captureDevice lockForConfiguration:nil];
    captureDevice.torchMode=AVCaptureTorchModeOn;
    captureDevice.activeFormat = currentFormat;
    captureDevice.activeVideoMinFrameDuration = CMTimeMake(1, FRAMES_PER_SECOND);
    captureDevice.activeVideoMaxFrameDuration = CMTimeMake(1, FRAMES_PER_SECOND);
    [captureDevice setVideoZoomFactor:4];
    [captureDevice unlockForConfiguration];

    // Set the output
    AVCaptureVideoDataOutput* videoOutput = [[AVCaptureVideoDataOutput alloc] init];

    // create a queue to run the capture on
    dispatch_queue_t captureQueue=dispatch_queue_create("catpureQueue", NULL);

    // setup our delegate
    [videoOutput setSampleBufferDelegate:self queue:captureQueue];

    // configure the pixel format
    videoOutput.videoSettings = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA], (id)kCVPixelBufferPixelFormatTypeKey,
                                 nil];
    videoOutput.alwaysDiscardsLateVideoFrames = NO;
    [self.session addOutput:videoOutput];

    // Start the video session
    [self.session startRunning];

【问题讨论】:

我不认为你可以在设备上强制240fps,它是最大值,同时处理图像,如果处理量很大,每秒帧数会下降,我建议你使用@987654323 @函数从Apple的示例代码中获取UIImage,稍后在处理之前调整大小,这应该会加快图像处理速度。 有趣的想法。在检索图像之后,我没有想过重新调整图像大小,但在我进行分析之前。我会尝试一下,看看它对性能有什么影响。希望调整图像大小是显卡操作,所以CPU不会受到太大影响。 这就是我所做的,当我从像素缓冲区检索时,我使用 CG 调整大小,因为我想要 640x480@60fps 而 Apple 不支持它。很好奇,为什么要以如此不人道的速度进行图像处理? 如何使用 GC 调整大小?我正在尝试改进使用 iPhone 6 摄像头的心率检测算法。大多数医疗设备的记录速度似乎在 180 到 220 fps 之间。 240 fps 应该使数据分辨率与这些设备相当。 我也尝试过,但我放弃了,似乎无法以高 fps 从输出缓冲区捕获 ***.com/questions/20738563/… 【参考方案1】:

试试GPUImage 库。每个过滤器都有方法forceProcessingAtSize:。在 GPU 上强制调整大小后,您可以使用 GPUImageRawDataOutput 检索数据。

我用这种方法在 CPU 上获得了 60fps 的进程映像。

【讨论】:

以上是关于如何在低分辨率的 iPhone 6 上获得 240fps的主要内容,如果未能解决你的问题,请参考以下文章

为不同的 iOS 设备使用不同的图像分辨率

我的 iOS 应用程序中的键盘在 iPhone 6 上太高了。如何在 XCode 中调整键盘的分辨率?

我的 iOS 应用程序中的键盘在 iPhone 6 上太高了。如何在 XCode 中调整键盘的分辨率?

带有新 iPhone 6 和 6+ 的 iAd

选择几乘的图片

iPhone 4s 外观模拟器