2011-02-02 12 views
12

私は涙のような感情表現を分析するプログラムを書こうとしています。私のトラッカーの一環として、私はOpenCVを使ってサンプルビデオを記録しています。特に、私はFPSを正しく選択する方法についてはっきりしていません(10FPSはうまくいくようです)。私も、私はOS X上で使用すべき コーデックわからない、私も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

どのプラットフォーム/ OSですか? –

+1

質問を編集して、SIGABRTの後にコンソール/端末に表示されるエラーメッセージを含めることができますか?これはエラーの詳細を理解するのに役立ちます。 – speciousfool

答えて

17

推奨コーデックを使用するには、hereをご覧ください。基本的には

  • あなたがWindowsのにしている場合にのみ、(manualを参照)-1の代わりCV_FOURCC(...)使用することができます。あなたはOSXのため、は使用できません
  • 使用CV_FOURCC('I', 'Y', 'U', 'V')非圧縮のAVIコンテナにYUV420P使用してエンコードする - これはあなたが圧縮されたビデオをしたい場合は、あなたがOpenCVの

でAVI出力を圧縮するffmpegのようなツールを使用することができます推奨されるアプローチ

  • ですOpenCVがコンプレッサコーデックを使用することを推奨しないのは、各コーデックに多数のコーデック固有のオプションがあり、単純なOpenCVビデオライタインターフェイスを使ってそれらのすべてを処理することが不可能なためです。私はいくつかbad news持っ

    EDIT

    :あなたはあなたのライブラリーを再設定し、再コンパイルする必要があるかもしれないよう

    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.

    が鳴ります。

    EDIT 2

    代わりに、あなただけのJPEGファイルに各フレームを書き込み、その後、(それはOS/X上で動作するはずです)ffmpegを使用して、ムービーにそれらのJPEGファイルをステッチができます。とにかくこれは本質的にMJPEGと同じです。ただし、時間的な冗長性を利用するコーデック(MPEG4、H.264など)では、おそらく圧縮率が向上します。

  • +0

    あなたの提案をありがとうございます。しかし、私はCV_FOURCCで試しました( '私は私の問題を見る時間を取ってくれてありがとう! WIndowsの-1やCV_FOURCC_PROMPTのようにダイアログをポップアップする方法はありますか? – CCS

    +1

    OS Xには、 – misha

    0

    私はCV_FOURCCラインが正しくないかもしれないと思います。 similar questionは、-1CV_FOURCCというテスト値として使用して、システム上の選択肢を確認するように指示しています。

    この質問からプログラムをコンパイルして、V_FOURCC('M', 'J', 'P', 'G')の代わりに-1の値を使用すると、AVIファイルを書き込むことができますか?

    +1

    親愛なる皆さん、フィードバックいただきありがとうございます。 V_FOURCC( 'M'、 'J'、 'P'、 'G')の代わりに値を-1に編集しました。ステータス値0でプログラムの実行と終了が可能になりました。 しかし、プログラムはAVIムービーファイル(ディスクに8 KB)を保存しましたが、これは明らかに空です。 OS X/X Code/OpenCV 2.2を使用しています。あなたは、すべてcvWriteFrameでいくつかの作業コードを持っていますか? – CCS

    +0

    私は@CCS – Lepi

    +0

    Downvotedと同じ問題を抱えていますが、これは質問に答えてくれないようですが、 – JohnAllen

    0

    私はそれがビデオのサイズのためだと思っています - 他のものを試してください。より一般的には640X480または320X240のようになります。

    私のために働く。

    3

    アサーションでは、ビデオライターに送信される画像とビデオライターを初期化するときに指定されるサイズの間にサイズの不一致があることが示唆されています。いくつかのデバッグステートメントを次のように追加することをお勧めします。

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

    サイズが異なるかどうかを確認するのに役立ちます。

    fourccの質問に関しては、cap_qtkitの代わりにcap_ffmpegを使用しているようです。 Macromediaを使用するのではなく、sourceforgeからopencv2.2を直接ダウンロードし、cmakeを使用してopencvでffmpegを使用しないように設定することができます。そのため、ffmpegを使用しないで再コンパイルしてみてください。 case qtkitがデフォルトになります。

    qtkitを使用する場合は、fourcc( '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

    :ここ

    はQTKitもお使いいただけ動作しますstarter_video.cppに基づく一例です。 Homebrewを使ってopencvを再インストールしてMacOS 10.9 MavericksとXCode 5でこの問題を解決しました。私は同じ問題を抱えていた--with-ffmpegの

    +0

    どのコーデックまたはfourccオプションを使用しましたか? – JohnAllen

    2

    OpenCVのを

    醸造をインストールします。 私はそれをPlanar RGBコーデックを使って解決しました。

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

    出力サイズは重要ですが、何もインストールせずに動作します。

    関連する問題