मैं आईफोन पर कुछ छवि प्रसंस्करण करने की कोशिश कर रहा हूँ। मैं कैमरे के फ्रेम को कैप्चर करने के लिए http://developer.apple.com/library/ios/#qa/qa2010/qa1702.html का उपयोग कर रहा हूं।आईफोन वीडियो आउटपुट छवि बफर accesing कम एफपीएस
मेरी समस्या यह है कि जब मैं कब्जा कर लिया गया बफर तक पहुंचने की कोशिश कर रहा हूं, तो कैमरा एफपीएस 30 से 20 तक गिर जाता है। क्या कोई जानता है कि मैं इसे कैसे ठीक कर सकता हूं?
मैं सबसे कम कैप्चर गुणवत्ता का उपयोग करता हूं जो मुझे मिल सकता है (AVCaptureSessionPresetLow = 192x144) kCVPixelFormatType_32BGRA प्रारूप में। अगर कोई कम गुणवत्ता जानता है तो मैं इसका उपयोग कर सकता हूं, मैं इसे आजमाने की कोशिश करता हूं।
जब मैं सिम्बियन की तरह अन्य प्लेटफार्मों पर एक ही छवि पहुंच करता हूं, तो यह ठीक काम करता है।
यहाँ मेरी कोड है:
#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 एफपीएस पर फ्रेम से निपटने के लिए, प्रत्येक फ्रेम के लिए कॉलबैक को एक सेकंड के 1/30 वें से कम में पूरा करने की आवश्यकता होगी। यदि ऐसा नहीं होता है, तो प्रोसेसिंग ऑपरेशंस सिर्फ उस धागे को जाम कर देगा जो वे चल रहे हैं। –
यदि यह निर्माता के रूप में काम नहीं करता-> उपभोक्ता पैटर्न - कॉलबैक सिर्फ कतारबद्ध हो जाएगा - यह सब संशोधित छवि के साथ क्या कर रहा है इस पर निर्भर करता है। अगर यह सिर्फ इसे बचा रहा है तो हे, इसे कहीं बफर में बैक अप दें। यदि इसे प्रदर्शित किया जा रहा है तो उसे एक समस्या मिली है :) – deanWombourne
मैंने एक समर्पित बफर पर memcpy की कोशिश की है, लेकिन यह वास्तव में मदद नहीं की थी, वास्तव में यह धीमा था :( – akaru