2015-01-29 10 views
6

मेरे पास वीडियो फ़ाइल है कि मैं एक समय में एक फ्रेम को संसाधित करने की कोशिश कर रहा हूं। मैंने निम्नलिखित प्रकार के कोड के साथ पढ़ने के लिए VideoCapture क्लास का उपयोग करने का प्रयास किया। समस्या यह है कि अगर वीडियो फ़ाइल 25 फ्रेम/सेकंड पर दर्ज की जाती है, तो पढ़ने एक ही गति से होती है। मेरे कंप्यूटर को डीकोड कर सकते हैं जैसे फ्रेम तेजी से कैसे प्राप्त करें?फाइल फ्रेम दर से पाइथन ओपनसीवी के साथ वीडियो फ़ाइलों को कैसे संसाधित करें?

मैं वीडियो स्ट्रीम को संसाधित करने की योजना बना रहा हूं और फिर उसे फ़ाइल में संग्रहीत करने की योजना बना रहा हूं।

import cv2 
import sys 
import time 

cap = cv2.VideoCapture(sys.argv[1]) 
start = time.time() 

counter = 0 
while True: 
    counter += 1; 
    image = cap.read()[1] 
    if counter %25 == 0: 
     print "time", time.time() - start 

आउटपुट: यह हर 25 फ्रेम में एक टाइमस्टैम्प प्रिंट करता है। ध्यान दें कि प्रत्येक लाइन => कार्यक्रम प्रक्रियाओं पर प्रति सेकंड लगभग 25 फ्रेम पर टाइमस्टैम्प लगभग 1 सेकंड तक कैसे बदलते हैं। यह वीडियो फ़ाइल के साथ 25 फ्रेम/सेकंड है।

time 1.25219297409 
time 2.25236606598 
time 3.25211691856 
time 4.25237703323 
time 5.25236296654 
time 6.25234603882 
time 7.252161026 
time 8.25258207321 
time 9.25195503235 
time 10.2523479462 

शायद वीडियो कैप्चर इस तरह के काम के लिए गलत एपीआई है, लेकिन इसके बजाय इसका क्या उपयोग करना है?

लिनक्स, फेडोरा 20, ओपनसीवी-पायथन 2.4.7 और पायथन 2.7.5 का उपयोग करना।

+0

"समस्या यह है कि अगर वीडियो फ़ाइल 25 फ्रेम/सेकेंड पर दर्ज की जाती है, तो पठन एक ही गति से होता है" - आप इसके बारे में गलत हैं। यह मूल framerate पर विचार नहीं करता है। उपरोक्त आपका कोड पहले से जितना तेज़ हो सके उतना तेज़ पढ़ता है। – berak

+0

"शायद इस तरह के काम के लिए वीडियो कैप्चर गलत एपीआई है" - हाँ, यह शायद सच है। यह छवियों को हासिल करने के लिए सिर्फ एक उपयोगिता है, और नहीं। – berak

+0

@berak पठन गति 30fps वीडियो के लिए 30fps, 15 एफपीएस वीडियो आदि के लिए 15fps लगता है जिसमें बहुत सी CPU निष्क्रिय है। –

उत्तर

6

मैं व्यवहार आपके द्वारा बताई गई पुन: पेश कर सकते हैं (अर्थात cv::VideoCapture >> image रिकॉर्ड किए गए वीडियो के फ्रेम दर के लिए बंद कर दिया) यदि opencv बिना ffmpeg समर्थन संकलित किया गया है। अगर मैं ffmpeg समर्थन के साथ opencv संकलित करता हूं, तो मैं जितनी जल्दी हो सके फ़ाइल से छवियों को पढ़ सकता हूं, क्योंकि मेरे कंप्यूटर की अनुमति होगी। मुझे लगता है कि ffmpeg की अनुपस्थिति में, ओपनसीवी gstreamer का उपयोग करता है और अनिवार्य रूप से वीडियो फ़ाइल का इलाज करता है जैसे कि यह एक फिल्म वापस चलाता है।

यदि आप लिनक्स का उपयोग कर रहे हैं, तो this link दिखाता है कि ओपनसीवी के लिए ffmpeg समर्थन प्राप्त करने के लिए आपको कौन से पैकेज इंस्टॉल करना होगा।

+0

मैं पुष्टि कर सकता हूं कि मैं वास्तव में फ़्रेमेट की तुलना में वीडियोकैप्चर से तेज़ी से पढ़ सकता हूं, लेकिन मैं ओपनसीवी 3.0 पर ffmpeg के साथ संकलित हूं। –

+0

यह समाधान लगता है। धन्यवाद –

0

मैंने अभी तक यह कोशिश नहीं की है, लेकिन मुझे लगता है कि यह मशीन पर सीमित वीडियो फ़ाइलों के लिए काम कर सकता है (यानी वेबकैम नहीं जीते)। एल्गोरिदम के केवल पूर्ववर्ती डाउनसाइड "मई" फ्रेम को छोड़ सकता है अगर यह पर्याप्त तेज़ी से संसाधित नहीं करता है लेकिन शायद यह अगले फ्रेम को नहीं पढ़ेगा। मुझे लगता है कि सामान्य रूप से, वीडियो कैप्चर एफपीएस की तुलना में धीमी गति से पढ़ सकता है लेकिन तेज़ी से नहीं पढ़ सकता है। मुझे इस पर उद्धरण न दें, लेकिन ऐसा कुछ जो मुझे लगता है मैंने देखा है।

एफपीएस को कंप्यूटर पर फ़ाइल से कुछ तेज़ी से बदलने के लिए VideoCapture::set() का उपयोग करें। CV_CAP_PROP_FPS वह है जिसे आप बदलना चाहते हैं।

एफपीएस उचित रूप से सेट करने के सत्यापन के लिए VideoCapture::get() फ़ंक्शन का उपयोग करें।

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