5

次のコードを使用して、ファイルからビデオを読み取り、キャニーエッジアルゴリズムを適用して、変更したビデオをファイルに書き込みます。コードはコンパイルされ、完全に実行されます。しかし、ビデオは書かれていません!私は完全に混乱しています。エラーを教えてください。ファイルはまったく作成されていません!OS:Ubuntu 12.10

出力ファイルに書き込むためのコード

出力ファイルを開く

bool setOutput(const std::string &filename, int codec=0, double framerate=0.0, bool isColor=true) {

    outputFile= filename;
    extension.clear();

    if (framerate==0.0) 
        framerate= getFrameRate(); // same as input

    char c[4];
    // use same codec as input
    if (codec==0) { 
        codec= getCodec(c);
    }

    // Open output video
    return writer.open(outputFile, // filename
    codec, // codec to be used 
    framerate,      // frame rate of the video
    getFrameSize(), // frame size
    isColor);       // color video?
}

フレームを書く

void writeNextFrame (Mat& frame)
{
    writer.write (frame);
}

そして、これらを実行する別の実行メソッドがあります

4

3 に答える 3

5

アプリケーションで奇妙な振る舞いに遭遇したときはいつでも、何が起こっているのかを理解するのに役立つ、短く、自己完結型の、正しい(コンパイル可能な)例を書きます。

私はあなたが何をすべきかを説明するために以下のコードを書きました。それが私のMacOSXで完全に機能することは注目に値します:

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

#include <iostream>
#include <string>

int main(int argc, char* argv[])
{
    // Load input video
    cv::VideoCapture input_cap("Wildlife.avi");
    if (!input_cap.isOpened())
    {
        std::cout << "!!! Input video could not be opened" << std::endl;
        return -1;
    }

    // Setup output video
    cv::VideoWriter output_cap("output.avi",  
                               input_cap.get(CV_CAP_PROP_FOURCC),
                               input_cap.get(CV_CAP_PROP_FPS), 
                               cv::Size(input_cap.get(CV_CAP_PROP_FRAME_WIDTH), input_cap.get(CV_CAP_PROP_FRAME_HEIGHT)));

    if (!output_cap.isOpened())
    {
        std::cout << "!!! Output video could not be opened" << std::endl;
        return -1;
    }

    // Loop to read frames from the input capture and write it to the output capture
    cv::Mat frame;
    while (true)
    {       
        if (!input_cap.read(frame))             
            break;

        output_cap.write(frame);
    }

    // Release capture interfaces   
    input_cap.release();
    output_cap.release();

    return 0;
}

入力ファイルをFFmpegで調べると、(ffmpeg -i Wildlife.avi)がわかります。

Input #0, avi, from 'Wildlife.avi':
  Metadata:
    ISFT            : Lavf52.13.0
  Duration: 00:00:07.13, start: 0.000000, bitrate: 2401 kb/s
    Stream #0.0: Video: msmpeg4v2, yuv420p, 1280x720, PAR 1:1 DAR 16:9, 29.97 tbr, 29.97 tbn, 29.97 tbc
    Stream #0.1: Audio: mp3, 44100 Hz, 2 channels, s16, 96 kb/s

および出力:

Input #0, avi, from 'output.avi':
  Metadata:
    ISFT            : Lavf52.61.0
  Duration: 00:00:07.10, start: 0.000000, bitrate: 3896 kb/s
    Stream #0.0: Video: msmpeg4v2, yuv420p, 1280x720, 29.97 tbr, 29.97 tbn, 29.97 tbc

したがって、2つのファイル間の唯一の重要な変更は、OpenCVによって生成された出力にオーディオストリームがないことです。これは、OpenCVがオーディオを処理しないため、正しい動作です。

アプリケーションを実行しているディレクトリで、ユーザーが読み取り/書き込み/実行するための適切な権限を持っていることを確認してください。また、コードに追加したデバッグは、おそらく入出力キャプチャに関連する問題を見つけるのに役立ちます。

于 2012-11-15T03:17:23.297 に答える
2

マシンにFFMPEGライブラリがインストールされていますか?Linuxでは、FFMPEGはビデオの作成に使用されます。WindowsではFFMPEGまたはVFWが使用されます。コマンドで確認

 ffmpeg -version

追加のライブラリをインストールしてみてください sudo apt-get install libavformat-dev libswscale-dev

また、writer.openを呼び出すと、ビデオライターを初期化または再初期化するだけです。次のビデオフレームをファイルに書き込むには、void VideoWriter :: write(const Mat&image)を呼び出す必要があります。これがうまくいくことを願っています。

于 2012-11-13T22:19:50.537 に答える
0

同じ問題が発生し、コーデックをDIVXに変更しました。これで、ビデオは.avi形式と.mp4形式の両方で保存されます。

于 2017-12-08T02:57:18.200 に答える