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.