2012-02-12 27 views
5
#include "cv.h" 
#include "highgui.h" 
int main(int argc, char** argv) 
{ 
CvCapture* capture=0; 
IplImage* frame=0; 

capture = cvCaptureFromAVI("C:\\boy walking back.avi"); // read AVI video 
if(!capture) 
    throw "Error when reading steam_avi"; 

cvNamedWindow("w", 1); 

for(; ;) 
{ 
/* int cvGrabFrame (CvCapture* capture); 
    IplImage* cvRetrieveFrame (CvCapture* capture)*/ 
    frame = cvQueryFrame(capture); 
if(!frame) 
     break; 
    cvShowImage("w", frame); 

} 
cvWaitKey(0); // key press to close window 
cvDestroyWindow("w"); 
cvReleaseImage(&frame); 
} 

का उपयोग कर .avi वीडियो से फ्रेम प्राप्त करना मैं वीएस -2008 के साथ ओपनसीवी का उपयोग कर रहा हूं। मैंने एक वीडियो फ़ाइल में पढ़ा है और फ्रेम की संख्या प्राप्त करने के लिए CV_CAP_PROP_FRAME_COUNT का उपयोग किया है जो 4 सेकंड लंबी वीडियो क्लिप के लिए लगभग 130 था। मैं चलने की गति पहचान कर रहा हूं इसलिए मुझे 5 फ्रेम के बीच से हर 5 फ्रेम प्राप्त करने की आवश्यकता है, शरीर की गति में थोड़ा बदलाव है। मेरे पास अब तक एक कार्यक्रम है जो मुझे वीडियो क्लिप का एक फ्रेम प्राप्त करने की अनुमति देता है। हालांकि, मैं अलग-अलग फ्रेम प्राप्त करने में असमर्थ हूं और मुझे यकीन नहीं है कि हर दूसरे 5 फ्रेम प्राप्त करने के बारे में कैसे जाना है। उपरोक्त कोड वीडियो का एक फ्रेम प्राप्त करने के लिए उपयोग किया जाता है।ओपनसीवी

उत्तर

6

आपको 4 फ्रेम छोड़ने और फिर 5 वें फ्रेम को रखने में सक्षम होना चाहिए।

IplImage* skipNFrames(CvCapture* capture, int n) 
{ 
    for(int i = 0; i < n; ++i) 
    { 
     if(cvQueryFrame(capture) == NULL) 
     { 
      return NULL; 
     } 
    } 

    return cvQueryFrame(capture); 
} 


int main(int argc, char* argv[]) 
{ 
    CvCapture* capture = cvCaptureFromFile("../opencv-root/samples/c/tree.avi"); 

    IplImage* frame = NULL; 
    do 
    { 
     frame = skipNFrames(capture, 4); 
     cvNamedWindow("frame", CV_WINDOW_AUTOSIZE); 
     cvShowImage("frame", frame); 
     cvWaitKey(100); 
    } while(frame != NULL); 

    cvReleaseCapture(&capture); 
    cvDestroyWindow("frame"); 
    cvReleaseImage(&frame); 

    return 0; 
} 

आशा में मदद करता है :)

+0

आपकी मदद के लिए धन्यवाद: नीचे एक छोटा सा उदाहरण मैं इस प्रदर्शन करने के लिए लिखा है। अगर मैं मूर्खतापूर्ण दिखाई देता हूं तो मुझे माफ़ कर दो, लेकिन मैं ओपनसीवी के लिए बिल्कुल नया हूं। जब आपका कोड चलाया गया था, तो वीडियो क्लिप तेजी से चल रहा था, निश्चित रूप से, 100 से देरी के समय को समायोजित करके बदला जा सकता है। हालांकि, क्या वीडियो के 5 फ्रेम में से केवल 1 प्राप्त करने का कोई तरीका है? उदाहरण के लिए, कोड का आउटपुट एक फ्रेम होगा जो व्यक्ति को मध्य-आंदोलन में दिखा रहा है। लेकिन अब तक आपकी सहायता के लिए बहुत बहुत धन्यवाद। –

+1

तो, क्या आप पूछ रहे हैं कि क्या आप एक्स को फ्रेम करना चाहते हैं, जहां एक्स 1 से 5 तक कोई फ्रेम हो सकता है? – mevatron

+0

मैं 5 फ्रेम में बहुत 1 निकालने में सक्षम था। आपकी मदद के लिए धन्यवाद :) अब मैं वीडियो में एक फ्रेम की मास्क छवि या प्रतिलिपि बनाई गई छवि बनाने की कोशिश कर रहा हूं। मैं आपको दिखाने के लिए 2 छवियों को अपलोड करना चाहता हूं कि मैं क्या हासिल करने की कोशिश कर रहा हूं लेकिन मेरे पास अभी तक 10 प्रतिष्ठा नहीं है:/क्या आप अभी भी मुझे सलाह दे सकते हैं कि किस ओपनसीवी कार्यों का उपयोग करना है? –