2013-02-13 34 views
6

मैं एक लाइव वीडियो फीड पर कुछ बढ़त का पता लगाने कर रहा हूँ:सीवी :: इतनी धीमी क्यों आकार बदलती है?

- (void)processImage:(Mat&)image; 
{ 
     cv::resize(image, smallImage, cv::Size(288,352), 0, 0, CV_INTER_CUBIC); 
     edgeDetection(smallImage); 
     cv::resize(smallImage, image, image.size(), 0, 0, CV_INTER_LINEAR); 
} 

edgeDetection काफी कुछ बड़े कार्य करने करता है, और 1280x720 का वीडियो फ्रेम आकार के साथ काफी कम फ़्रेमरेट पर चल रहा था। resize कॉल नाटकीय रूप से में जोड़ने से फ़्रेमेट कम हो गया, जो मैं अपेक्षा कर रहा था उससे काफी विपरीत था। क्या यह सिर्फ इसलिए है क्योंकि एक आकार बदलने का ऑपरेशन धीमा है, या क्योंकि मैं कुछ गलत कर रहा हूं?

smallImage हैडर इस प्रकार में घोषित किया जाता है:

@interface CameraController : UIViewController 
<CvVideoCameraDelegate> 
{ 
    Mat smallImage; 
} 

इसका कोई initialisation है, और यह ठीक काम करता है।

उत्तर

14

एक छवि का आकार बदलना धीमा है, और आप इसे प्रत्येक संसाधित फ्रेम के लिए दो बार कर रहे हैं। किसी भी तरह से अपने समाधान में सुधार करने के कई तरीके हैं लेकिन आपको उस समस्या के बारे में अधिक जानकारी प्रदान करनी है जिसे आप हल करने का प्रयास कर रहे हैं।

किनारों का पता लगाने से पहले एक छवि का आकार बदलने के परिणामस्वरूप कम जानकारी के साथ किनारे का पता लगाने में परिणाम होगा जिससे इसके परिणामस्वरूप कम किनारों का पता चल जाएगा - या कम से कम यह उन्हें पहचानना कठिन बना देगा।

भी आकार बदलने के लिए इस्तेमाल किया एल्गोरिथ्म को प्रभावित करता है इसकी गति, CV_INTER_LINEAR सीवी के लिए सबसे तेजी से है :: का आकार बदल मेरी स्मृति में विफल नहीं हुआ है - और आप पहले आकार बदलने के लिए CV_INTER_CUBIC उपयोग कर रहे हैं।

एक वैकल्पिक छवि का आकार बदलने के लिए मूल छवि के एक छोटे से क्षेत्र को संसाधित करना है। इसके लिए आपको ओपनसीवी छवि आरओआई (ब्याज का क्षेत्र) पर एक नज़र डालना चाहिए। यह करना बहुत आसान है, आपके पास इस साइट में उन लोगों के बारे में बहुत सारे प्रश्न हैं। नकारात्मकता यह है कि आप केवल एक क्षेत्र में किनारों का पता लगाएंगे, न कि पूरी छवि के लिए, यह समस्या के आधार पर ठीक हो सकता है।

तुम सच में छवियों का आकार चाहते हैं, opencv डेवलपर्स आमतौर पर, pyrDown और pyrUp कार्यों का उपयोग जब वे छोटे आकार के चित्रों पर कार्रवाई करना चाहते हैं के बजाय का आकार बदलने के। मुझे लगता है कि ऐसा इसलिए है क्योंकि यह तेज़ है, लेकिन आप इसे सुनिश्चित करने के लिए परीक्षण कर सकते हैं। More information about pyrDown and pyrUp in this link.

सीवी बारे में :: एल्गोरिदम का आकार बदलने के लिए, यहाँ सूची है:

INTER_NEAREST - a nearest-neighbor interpolation 
INTER_LINEAR - a bilinear interpolation (used by default) 
INTER_AREA - resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method. 
INTER_CUBIC - a bicubic interpolation over 4x4 pixel neighborhood 
INTER_LANCZOS4 - a Lanczos interpolation over 8x8 pixel neighborhood 

यकीन है कि अगर INTER_LINEAR उन सब का सबसे तेजी से है के लिए नहीं कह सकते, लेकिन यह यकीन है कि तुलना में तेजी के लिए है INTER_CUBIC

+0

उत्कृष्ट उत्तर, धन्यवाद। – fredley

+1

असल में, मेरे लिए, __INTER \ _NEAREST__ सबसे तेज़ है –