2015-12-14 49 views
5

मैं सी ++ और ओपनसीवी का उपयोग करके एक वास्तविक समय छवि विश्लेषण प्रोजेक्ट विकसित कर रहा हूं जिसके लिए वेबकैम से निकाले जाने वाले फ्रेम की आवश्यकता होती है। मैं किसी भी प्रकार की गति से इन फ्रेमों को निकालने की कोशिश करने में समस्याएं चला रहा हूं - वर्तमान में मैं केवल 18 एफपीएस का प्रबंधन कर सकता हूं।वेबकैम से फ़्रेम का तेज़ निष्कर्षण: सी ++ और ओपनसीवी बनाम मैटलैब

#include "opencv2/highgui/highgui.hpp" 
#include <iostream> 
#include <ctime> 

using namespace std; 
using namespace cv; 

int main (int argc, char* argv[]) 
{ 

    VideoCapture cap(0); 
    if(!cap.isOpened()) return -1; 
    namedWindow("video", CV_WINDOW_AUTOSIZE); 

    clock_t start = clock(); 

    for (int i = 0; i < 101; ++i) 
    { 
     Mat frame; 
     cap >> frame; 
     imshow("video", frame); 
     waitKey(1); 
    } 

    clock_t finish = clock(); 

    double time_elapsed = (finish - start)/1000.0; 
    double fps = 100/time_elapsed; 

    cout << "\n\nTIME: " << time_elapsed << "\n\nFPS: " << fps << "\n\n"; 

    return 0; 
} 

मैं अन्य कोड की कोशिश की है, लेकिन कोई भी मुझे फ्रेम की तुलना में 18 एफपीएस तेजी से निकालने के लिए अनुमति देते हैं: यहाँ सरल कोड मैं वेब कैमरा से तख्ते निकालने के लिए उपयोग कर रहा हूँ है।

vid = videoinput('winvideo', 1, 'MJPG_640x480'); 
triggerconfig(vid, 'manual');  
start(vid); 

tic; 

for k = 1:100; 
    clc; 
    disp(k); 
    I = peekdata(vid, 1); 
    imshow(I); 
    drawnow; 
end 

toc; 

close(); 
stop(vid); 
delete(vid); 

मैं अपने सी ++ परियोजना में तेजी लाने के लिए और भी करने के लिए MEX फ़ाइलों का उपयोग कर देखा है: 50 एफपीएस (निम्न कोड का प्रयोग करके) - मैं क्या मैं के 40 मैटलैब में प्राप्त कर सकते हैं के लिए इसी तरह की गति तक पहुँचने के लिए आशा करती हूं कि जीपीयू/सीयूडीए समर्थन को सक्षम करने के लिए, लेकिन मैंने कुछ हार्डवेयर समस्याओं को मारा है, इसलिए मैं देख रहा था कि मेरे वर्तमान कोड में कोई आसान दृष्टिकोण या कुछ याद आ रहा है या नहीं।

अग्रिम धन्यवाद!

संपादित मैं सिर्फ कोड पर एक प्रदर्शन के विश्लेषण भाग गया और वहां कुछ चिपचिपा अंक अर्थात् है:

VideoCapture cap(0);   10.5% 
cap >> frame;     36.8% 
imshow("video", frame);   31.6% 
+0

आप कोड http://answers.opencv.org/question/72386/how-to-get-fps-in-opencv-live पर परीक्षण कर सकते हैं -कैप्चर/अगर कोई अंतर आएगा तो मुझे बताएं। – sturkmen

+0

आपकी प्रतिक्रिया के लिए धन्यवाद। अपने लिंक में दोनों उदाहरणों को आजमाते हुए मुझे केवल 15fps की औसत तक पहुंचने की अनुमति मिली। – MSTTm

+0

यदि आप डीबग मोड चलाते हैं, तो रिलीज़ मोड आज़माएं। – sturkmen

उत्तर

3

waitkey (1) आप धीमा हो रहा है। आप इसे प्रत्येक पर करने की कोशिश कर सकते हैं, उदाहरण के लिए, दसवीं पुनरावृत्ति। देखें http://answers.opencv.org/question/52774/waitkey1-timing-issues-causing-frame-rate-slow-down-fix/

एफपीएस की गणना करने का आपका तरीका खराब है। कोशिश
double time_elapsed = (finish - start)/CLOCKS_PER_SEC; यह गारंटी नहीं है कि CLOCKS_PER_SEC == 1000

+0

'WaitKey (1) 'केवल 1ms धीमा होना चाहिए, यह हो सकता है कि वेबकैम फ्रेम बनाने में धीमा हो। सस्ते वेबकैम – mirosval

+0

के साथ यह असामान्य नहीं है असल में, यह एक खिड़की प्राप्त करने वाले सभी संदेशों को प्रेषित करता है, इसलिए यह * कम से कम * 1ms लेता है। –

+0

दाएं, लेकिन फिर भी 18 एफपीएस के साथ आपके पास प्रत्येक फ्रेम को संसाधित करने के लिए 55ms हैं। 30 एफपीएस पर आपके पास अभी भी 33 एमएमएस होगा, इसलिए यदि 'वेटकी (1)' के लिए 1 या 5ms कोई फर्क नहीं पड़ता है तो मुझे लगता है। आप अभी भी वेबकैम की प्रतीक्षा कर रहे हैं। – mirosval

संबंधित मुद्दे