1

これは、OpenCV を使用して画像からビデオを作成するサンプル プログラムです。しかし、出力ビデオが機能せず、「ストリームを逆多重化できませんでした」というエラーが発生しました。助けてください。

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

  int main()
{
    //CvVideoWriter *writer = 0;
    int isColor = 1;
    int fps     = 25;  // or 30
    int frameW  = 320; // 744 for firewire cameras
    int frameH  = 240; // 480 for firewire cameras
    CvSize size;

    size.width = frameW;
    size.height = frameH;
    CvVideoWriter *writer = cvCreateVideoWriter(
            "data3.avi",
            CV_FOURCC('M','J','P','G'),
            fps,
            size);
    IplImage* img = 0; 
    img=cvLoadImage("IMG_0157.JPG");
    for(int counter=0;counter < 3000;counter++)
    {
    cvWriteFrame(writer,img);      // add the frame to the file
    }
    cvReleaseVideoWriter(&writer);
    return 0;
}
4

3 に答える 3

6

別の FOURCC コードを試すことができます。それらの一部は OpenCV で正しくサポートされておらず、一部はマルチメディア アプリでサポートされています。OpenCV とお気に入りのビデオ プレーヤーの両方で動作するものを用意するには、試行錯誤が必要です。

試すことができること: VLC を使用します (まだ使用していない場合)。最も強力なプレーヤーの 1 つです。

OpenCV で画像のシーケンスをビデオとして表示/処理するだけの場合は、VideoCapture の文書化されていない機能を使用できます。画像のシーケンスをロードします。

例は C++ ですが、簡単に C に変換できます。

// pics are a sequence of Pictures001.jpg, PicturesS002.jpg, etc
cv::VideoCapture cap("path/to/my/Pictures%03d.jpg");

cv::Mat frame;

for(;;)
{
    cap >> frame;
    if(frame.empty())
       break;

    // do some processing
}
于 2012-06-21T06:14:25.130 に答える
1

また、複数の画像からビデオを作成しようとしています。わかりませんでしたが、単一の画像を読み込もうとしていますか?

IplImage* img = 0; img=cvLoadImage("IMG_0157.JPG");

ビデオを作成するために読み込もうとしていた画像の幅と高さが得られなかったため、ビデオに問題がありました。だから私は最初にそれらの妥当性を得ました:

IplImage *img = cvLoadImage("<folder>\\<image_name>.jpg");

size.width = img->width;
size.height = img->height;

次に、ビデオ ライターを作成し、存在するかどうかを確認しました。

CvVideoWriter *writer = cvCreateVideoWriter(
    "<video_name>.avi",
    -1,//CV_FOURCC('I','Y','U','V'), // VIDEO CODEC
    fps,
    size);

if(writer == NULL)
    std::cout << "No videowrite here!" << '\nl';

そして、見つかった各画像について、ビデオのフレームに書き込み、それを解放しました。

while(img!=NULL)
{
    sprintf( filename, "<folder>\\<image_name>_%d.jpg", i );

    img = cvLoadImage(filename); //imagem b&w
    cvWriteFrame(writer,img);

    i++;
}

cvReleaseVideoWriter(&writer);
cvReleaseImage(&img);

そしてそれは働いた!

filename変数とを初期化することを忘れないでくださいint i

それが役に立ったことを願っています!

于 2013-03-27T17:44:33.693 に答える