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);
}

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

5

Решение

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

Я написал код ниже, чтобы проиллюстрировать, что вы должны делать. Стоит отметить, что он отлично работает на моем 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 не имеет дело со звуком.

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

5

Другие решения

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

 ffmpeg -version

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

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

2

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

0
По вопросам рекламы [email protected]