如何在低分辨率的 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 应用程序中的键盘在 iPhone 6 上太高了。如何在 XCode 中调整键盘的分辨率?