Я пытаюсь выполнить некоторую обработку изображений на iPhone. Я использую http://developer.apple.com/library/ios/#qa/qa2010/qa1702.html для захвата кадров камеры.Низкий FPS при доступе к видеоизображению видеоизображения iPhone
Моя проблема заключается в том, что когда я пытаюсь получить доступ к захваченному буфере, камера FPS падает с 30 до 20. Кто-нибудь знает, как я могу это исправить?
Я использую самое низкое качество захвата, которое я мог найти (AVCaptureSessionPresetLow = 192x144) в формате kCVPixelFormatType_32BGRA. Если кто-то знает более низкое качество, которое я мог бы использовать, я готов попробовать.
Когда я делаю тот же доступ к изображениям на других платформах, таких как Symbian, он работает нормально.
Вот мой код:
#pragma mark -
#pragma mark AVCaptureSession delegate
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection
{
/*We create an autorelease pool because as we are not in the main_queue our code is
not executed in the main thread. So we have to create an autorelease pool for the thread we are in*/
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
//Lock the image buffer
if (CVPixelBufferLockBaseAddress(imageBuffer, 0) == kCVReturnSuccess)
{
// calculate FPS and display it using main thread
[self performSelectorOnMainThread:@selector(updateFps:) withObject: (id) nil waitUntilDone:NO];
UInt8 *base = (UInt8 *)CVPixelBufferGetBaseAddress(imageBuffer); //image buffer start address
size_t width = CVPixelBufferGetWidth(imageBuffer);
size_t height = CVPixelBufferGetHeight(imageBuffer);
int size = (height*width);
UInt8* pRGBtmp = m_pRGBimage;
/*
Here is the problem; m_pRGBimage is RGB image I want to process.
In the 'for' loop I convert the image from BGRA to RGB. As a resault, the FPS drops to 20.
*/
for (int i=0;i<size;i++)
{
pRGBtmp[0] = base[2];
pRGBtmp[1] = base[1];
pRGBtmp[2] = base[0];
base = base+4;
pRGBtmp = pRGBtmp+3;
}
// Display received action
[self performSelectorOnMainThread:@selector(displayAction:) withObject: (id) nil waitUntilDone:NO];
//[self displayAction:&eyePlayOutput];
//saveFrame(imageBuffer);
//unlock the image buffer
CVPixelBufferUnlockBaseAddress(imageBuffer,0);
}
[pool drain];
}
В последующее к ответам, мне нужно обработать изображение в режиме реального времени, оно отображается.
Я заметил, что когда я использую AVCaptureSessionPresetHigh, самое простое, что я делаю, как:
for (int i=0;i<size;i++)
x = base[0];
вызывает фреймрейт снизится до 4-5 кадров в секунду. Я предполагаю, потому что изображение в этом размере не кэшируется.
В принципе мне нужно изображение 96x48. есть ли простой способ уменьшить изображение камеры, способ использования аппаратного ускорения, чтобы я мог работать с маленьким?
Я согласен, что это, скорее всего, медленная обработка, которая перетаскивает весь снимок, но я не уверен, что простое освобождение блокировки рано сделает много, чтобы помочь. Чтобы иметь дело с кадрами при 30 FPS, обратный вызов для каждого кадра должен завершиться менее чем за 1/30 секунды. Если это не так, операции обработки просто затмевают поток, в котором они работают. – 2010-11-23 19:29:07
Не, если он работал в качестве шаблона производителя-> потребителя - обратные вызовы просто встали в очередь - все зависит от того, что он делает с измененным изображением. Если это просто сохранить его, тогда эй, пусть он будет где-то в буфере. Если он отображается, то у него проблема :) – deanWombourne 2010-11-24 11:32:20