OpenCV не сохраняет видео

Я использую следующий код для чтения видео из файла, применения алгоритма canny edge и записи измененного видео в файл. Код компилируется и работает отлично. Но видео не написано! Я в полном замешательстве. Пожалуйста, скажите мне, в чем ошибка. Файл не создается вообще! ОС: 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);
}

И есть отдельный метод запуска, который выполняет эти

3 ответа

Решение

Всякий раз, когда я сталкиваюсь со странным поведением в своих приложениях, я пишу короткий, самодостаточный, правильный (компилируемый) пример, чтобы помочь мне понять, что происходит.

Я написал код ниже, чтобы проиллюстрировать, что вы должны делать. Стоит отметить, что он отлично работает на моем Mac OS X:

#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

Таким образом, единственным существенным изменением между этими двумя файлами является то, что выходные данные, генерируемые OpenCV, не имеют аудиопотока, что является правильным поведением, поскольку OpenCV не имеет дело со звуком.

Убедитесь, что у вашего пользователя есть соответствующие права на чтение / запись / выполнение в каталоге, в котором вы запускаете приложение. Кроме того, отладки, которые я добавил в код, вероятно, помогут вам найти проблемы, связанные с захватом ввода / вывода.

У вас на компьютере установлена ​​библиотека FFMPEG? В Linux FFMPEG используется для записи видео; в Windows используется FFMPEG или VFW. проверить по команде

 ffmpeg -version

попробуйте установить дополнительные библиотеки sudo apt-get install libavformat-dev libswscale-dev,

Вызывая writer.open, вы только инициализируете или переинициализируете программу записи видео. Вам нужно вызвать void VideoWriter::write(const Mat& image), чтобы записать следующий видеокадр в файл. Я надеюсь, что это будет работать.

У меня была такая же проблема, и я изменил кодеки на DIVX. Теперь видео сохраняется в форматах.avi и.mp4.

Другие вопросы по тегам