2011-02-02 12 views
12

मैं आँसू जैसे भावनात्मक अभिव्यक्तियों का विश्लेषण करने के लिए एक प्रोग्राम लिखने की कोशिश कर रहा हूं। मेरे ट्रैकर के हिस्से के रूप में मैं नमूना वीडियो रिकॉर्ड करने के लिए ओपनसीवी का उपयोग कर रहा हूं। विशेष रूप से, मैं निश्चित रूप से निश्चित नहीं हूं कि एफपीएस का चयन कैसे करें (10 एफपीएस ऐसा लगता है जैसे इसे काम करना चाहिए)। मैं भी यकीन है कि जो कोडेक मैं ओएस एक्स पर इस्तेमाल करना चाहिए नहीं कर रहा हूँ, मैं भी here से हर संभव कोशिश की, लेकिन CV_FOURCC ने निम्नलिखित त्रुटि है:OpenCV के साथ एक वीडियो फ़ाइल कैसे लिखें?

Stream #0.0: Video: rawvideo, yuv420p, 640x480, q=2-31, 19660 kb/s, 90k tbn, 10 tbc 
Assertion failed: (image->imageSize == avpicture_get_size((PixelFormat)input_pix_fmt, image->width, image->height)), function writeFrame, file /opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_graphics_opencv/work/OpenCV-2.2.0/modules/highgui/src/cap_ffmpeg.cpp, line 1085. 

आप सभी cvWriteFrame के साथ कुछ काम कर कोड है? मेरी समस्या को देखने के लिए समय निकालने के लिए धन्यवाद!

रुचि रखने वालों के पूरे कार्यक्रम के लिए है:

#include <cv.h> 
#include <cxcore.h> 
#include <highgui.h> 

int main (int argc, const char * argv[]) 
{ 
    CvCapture *capture; 
    IplImage *img; 
    int  key = 0; 
    CvVideoWriter *writer; 

    // initialize camera 
    capture = cvCaptureFromCAM(0); 
    // capture = cvCaptureFromAVI("AVIFile"); 

    // always check 
    assert(capture); 

    // create a window 
    cvNamedWindow("video", 1); 

    int color = 1; // 0 for black and white 

    // get the frame size 
    CvSize size = cvSize((int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH),(int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT)); 

    writer = cvCreateVideoWriter(argv[1], -1 , 10 , size, color); 

    while(key != 'q') { 
     // get a frame 
     img = cvQueryFrame(capture); 

     // always check 
     if(!img) break; 

     cvWriteFrame(writer, img);   
     cvShowImage("video", img); 

     // quit if user press 'q' 
     key = cvWaitKey(5); 
    } 

    // free memory 
    cvReleaseVideoWriter(&writer); 
    cvReleaseCapture(&capture); 
    cvDestroyWindow("video"); 

    return 0; 
} 
+1

क्या मंच/ओएस? –

+1

क्या आप SIGABRT के बाद कंसोल/टर्मिनल में मुद्रित त्रुटि संदेश को शामिल करने के लिए प्रश्न संपादित कर सकते हैं? इससे हमें त्रुटि के बारे में अधिक समझने में मदद मिलेगी। – speciousfool

उत्तर

17

अनुशंसित कोडेक्स का उपयोग करने के लिए here पर एक नज़र डालें।

मूल रूप से

:

  • आप -1 बजाय CV_FOURCC(...)उपयोग कर सकते हैं केवल यदि आप Windows पर हैं (देखें manual)। चूंकि आप ओएसएक्स पर हैं, आप इसका उपयोग नहीं कर सकते।
  • उपयोग CV_FOURCC('I', 'Y', 'U', 'V') एक असम्पीडित AVI कंटेनर में yuv420p का उपयोग कर सांकेतिक शब्दों में बदलना करने के लिए - इस दृष्टिकोण
  • सिफारिश आप संकुचित वीडियो चाहते हैं है, तो आप ffmpeg जैसे उपकरणों का उपयोग कर सकते हैं OpenCV
  • द्वारा

AVI उत्पादन संपीड़ित करने के लिए ओपनसीवी कंप्रेसर कोडेक्स का उपयोग करने की अनुशंसा नहीं करता है क्योंकि संभवतः प्रत्येक कोडेक में बड़ी संख्या में कोडेक-विशिष्ट विकल्प होते हैं, और सरल ओपनसीवी वीडियो लेखक इंटरफ़ेस के माध्यम से उन सभी से निपटना असंभव होगा। जैसे आप को पुन: कॉन्फ़िगर और अपने पुस्तकालय पुन: संयोजित करना पड़ सकता है

Unfortunately, we still have no working (i.e. native) video writer for Mac OS X. If you need video writing, you should currently configure for ffmpeg or xine and disable QuickTime.

ध्वनि:

संपादित

मैं कुछ bad news है।

संपादित 2

वैकल्पिक रूप से, तुम सिर्फ एक JPEG फ़ाइल के लिए प्रत्येक फ्रेम लिखते हैं, और फिर एक फिल्म ffmpeg का उपयोग कर में उन जेपीईजी फ़ाइलें सिलाई (कि OS/एक्स पर काम करना चाहिए) कर सकता है। यह अनिवार्य रूप से एमजेपीईजी क्या है, वैसे भी। आपको शायद कोडेक्स के साथ बेहतर संपीड़न दर मिल जाएगी जो अस्थायी अनावश्यकता का उपयोग करती है (उदाहरण के लिए एमपीईजी 4, एच .264, आदि)।

+0

आपके सुझावों के लिए धन्यवाद। हालांकि, मैंने सीवी_एफओआरसीसी ('I' ',' वाई ',' यू ',' वी ') दस्तावेज में सूचीबद्ध सभी चार सीसीसी सहित, लेकिन सफलता के बिना। क्या ओएस एक्स में संवाद को पॉप अप करने का कोई तरीका है जैसे कि विन्डोज़ -1 या सीवी_एफओआरसीसी_PROMPT के साथ कैसे करते हैं? – CCS

+1

कृपया देखें मेरा अद्यतन उत्तर – misha

0

मुझे लगता है कि CV_FOURCC लाइन गलत हो सकता है। similar question-1 का उपयोग CV_FOURCC परीक्षण मान के रूप में आपके सिस्टम पर काम करने वाले विकल्पों के साथ आपको संकेत देने के लिए करता है।

क्या आप इस प्रश्न से प्रोग्राम को संकलित करने का प्रयास कर सकते हैं और हमें बता सकते हैं कि -1 के मूल्य का उपयोग V_FOURCC('M', 'J', 'P', 'G') के बजाय एक AVI फ़ाइल लिखता है?

+1

प्रिय सभी, प्रतिक्रिया के लिए धन्यवाद। मैंने V_FOURCC ('एम', 'जे', 'पी', 'जी') के बजाय मान -1 को संपादित किया है। कार्यक्रम अब निष्पादित किया जा सकता है और स्थिति मान के साथ बाहर निकला जा सकता है: 0। हालांकि, कार्यक्रम ने एक एवीआई फिल्म फ़ाइल (डिस्क पर 8 केबी) को बचाया जो स्पष्ट रूप से खाली है। मैं ओएस एक्स/एक्स कोड/ओपनसीवी 2.2 का उपयोग कर रहा हूं। क्या आपके पास cvWriteFrame के साथ कुछ कामकाजी कोड है? मेरी समस्या को देखने के लिए समय निकालने के लिए धन्यवाद! " – CCS

+0

मेरे पास @CCS – Lepi

+0

डाउनवॉटेड जैसा ही समस्या है क्योंकि यह प्रश्न का उत्तर नहीं दे रहा है। – JohnAllen

0

मुझे लगता है कि यह वीडियो के आकार की वजह से है - दूसरों को आजमाएं, 640X480 या 320X240 जैसी अधिक आम है।

यह मेरे लिए काम करता है।

3

दावा से पता चलता है कि वीडियो लेखक को भेजी गई छवि के बीच एक आकार विसंगति है, और वीडियो लेखक को प्रारंभ करते समय निर्दिष्ट आकार। मैं कुछ डीबग स्टेटमेंट्स को निम्नानुसार जोड़ने का सुझाव दूंगा:

cout << "Video Size: " << size.width << "," << size.height << endl; 
cout << "Image Size: " << img.cols << "," << img.rows << endl; 

इससे आपको यह पता लगाने में मदद करनी चाहिए कि आकार अलग हैं या नहीं।

चौथा प्रश्न के संबंध में, ऐसा लगता है कि आप cap_qtkit के बजाय cap_ffmpeg का उपयोग कर रहे हैं। आप ffmpeg off के साथ recompiling का प्रयास करना चाह सकते हैं, क्योंकि कैप्चर का qtkit संस्करण ओएस एक्स पर बहुत अच्छी तरह से काम करता है। मैकपोर्ट्स का उपयोग करने के बजाय, आप सीधे Sourceforge से opencv2.2 डाउनलोड कर सकते हैं और fcppeg का उपयोग न करने के लिए opencv को कॉन्फ़िगर करने के लिए ccmake का उपयोग कर सकते हैं, उसमें मामला qtkit डिफ़ॉल्ट होगा।

यदि आप qtkit का उपयोग करते हैं, तो आपको चारcc ('j', 'p', 'e', ​​'g') का उपयोग करने की आवश्यकता है;

फ्रेम दर इनपुट की फ्रेम दर से मेल खाना चाहिए। आप फ्रेम की चौड़ाई और ऊंचाई प्राप्त करने के तरीके के समान फ्रेम दर प्राप्त करने के लिए गुणों का उपयोग कर सकते हैं, हालांकि जब से आप कैमरे से कैप्चरिंग कर रहे हैं, तो आपको शायद अपने कोड में टाइमर का उपयोग करके कैप्चर रेट का परीक्षण करना होगा और अनुमान लगाया जाएगा उस।

/* 
* starter_video_write.cpp 
* 
* Created on: Nov 23, 2010 
*  Author: Ethan Rublee 
* Modified on: Aug 3, 2011 by David Cooper 
* 
* A starter sample for using opencv, get a video stream and display the images 
* easy as CV_PI right? 
* edited to add writing capability for OS X using qtkit. 
*/ 
#include "opencv2/highgui/highgui.hpp" 
#include <iostream> 
#include <vector> 
#include <stdio.h> 

using namespace cv; 
using namespace std; 



//hide the local functions in an anon namespace 
namespace { 
    void help(char** av) { 
     cout << "\nThis program justs gets you started reading images from video\n" 
      "Usage:\n./" << av[0] << " <video device number>\n" 
      << "q,Q,esc -- quit\n" 
      << "space -- save frame\n\n" 
      << "\tThis is a starter sample, to get you up and going in a copy pasta fashion\n" 
      << "\tThe program captures frames from a camera connected to your computer.\n" 
      << "\tTo find the video device number, try ls /dev/video* \n" 
      << "\tYou may also pass a video file, like my_vide.avi instead of a device number" 
      << endl; 
    } 

    int process(VideoCapture& capture) { 
     int n = 0; 
     char filename[200]; 
     string window_name = "video | q or esc to quit"; 
     cout << "press space to save a picture. q or esc to quit" << endl; 
     namedWindow(window_name, CV_WINDOW_KEEPRATIO); //resizable window; 
     Mat frame; 
    double frameRate = 15.0; 
    capture >> frame; 
    VideoWriter* writer = NULL; 
    // FIXME: need to change this to an absolute path that exists on this system 
    string outputFile = "/tmp/test.mov"; 
    writer = new VideoWriter(outputFile, 
       CV_FOURCC('j','p','e','g'), 
       frameRate,Size(frame.cols,frame.rows)); 


     for (;;) { 
      capture >> frame; 
      if (frame.empty()) 
       continue; 
      imshow(window_name, frame); 
     writer->write(frame); 
      char key = (char)waitKey(5); //delay N millis, usually long enough to display and capture input 
      switch (key) { 
     case 'q': 
     case 'Q': 
     case 27: //escape key 
      if(writer != NULL) { 
     delete writer; 
      } 
      return 0; 
     case ' ': //Save an image 
      sprintf(filename,"filename%.3d.jpg",n++); 
      imwrite(filename,frame); 
      cout << "Saved " << filename << endl; 
      break; 
     default: 
      break; 
      } 
     } 
     return 0; 
    } 

} 

int main(int ac, char** av) { 

    if (ac != 2) { 
     help(av); 
     return 1; 
    } 
    std::string arg = av[1]; 
    VideoCapture capture(arg); //try to open string, this will attempt to open it as a video file 
    if (!capture.isOpened()) //if this fails, try to open as a video camera, through the use of an integer param 
     capture.open(atoi(arg.c_str())); 
    if (!capture.isOpened()) { 
     cerr << "Failed to open a video device or video file!\n" << endl; 
     help(av); 
     return 1; 
    } 
    return process(capture); 
} 
0

Misha के जवाब को पढ़ने के बाद:

यहाँ एक उदाहरण starter_video.cpp के आधार पर कि QTKit के साथ काम करेंगे है। मैंने होमब्री का उपयोग करके ओपनसीवी को पुनर्स्थापित करके मैक ओएस 10.9 मैवरिक्स और एक्सकोड 5 के तहत इस समस्या का समाधान किया।

+0

आप किस कोडेक या चारcc विकल्प का उपयोग किया था? – JohnAllen

2

--with-ffmpeg मैं एक ही समस्या थी

काढ़ा opencv स्थापित करें। मैंने प्लानर आरजीबी कोडेक का उपयोग करके इसे हल किया।

outputVideo.open(PathName, CV_FOURCC('8','B','P','S'), myvideo.get(CV_CAP_PROP_FPS),CvSize(outputframe.size())); 

आउटपुट आकार महत्वपूर्ण है, लेकिन यह कुछ भी इंस्टॉल किए बिना काम करता है।

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