Я попытался записать видео из последовательности образов, созданных OpenCV. Однако я не могу открыть видео после их написания. Я думаю, есть проблема с кодеком. Мне очень сложно найти ошибку. Вот мой код:
Size size = Size(vecOfMats[0].rows,vecOfMats[0].cols);
int codec = CV_FOURCC('D', 'I', 'V', 'X');
VideoWriter videoWriter;
videoWriter.open(outputFilename,codec,15.0,size,true);
for(int z=0; z < vecOfMats.size(); z++)
{
videoWriter.write(vecOfMats[z]);
}
videoWriter.release();
Я также пробовал все эти кодеки без успеха (либо OpenCv не смог найти кодек, либо невозможно открыть видео):
int codec = CV_FOURCC('P','I','M','1'); // = MPEG-1 codec
int codec = CV_FOURCC('M','J','P','G'); // = motion-jpeg codec - cannot be played by VLC
int codec = CV_FOURCC('M', 'P', '4', '2');// = MPEG-4.2 codec - not found
int codec = CV_FOURCC('D', 'I', 'V', '3');// = MPEG-4.3 codec - not found
int codec = CV_FOURCC('D', 'I', 'V', 'X');// = MPEG-4 codec - cannot be played by VLC
int codec = CV_FOURCC('U', '2', '6', '3');// = H263 codec - must have w/h = 4
int codec = CV_FOURCC('I', '2', '6', '3');// = H263I codec - not found
Я даже взял кодек видео, открытый через OpenCV ранее (без успеха):
string filename = "/path/to/the/video/myVideo.avi";
VideoCapture capture(filename);
int ex = static_cast<int>(capture.get(CV_CAP_PROP_FOURCC)); // Get Codec Type- Int form
char EXT[] = {(char)(ex & 0XFF) , (char)((ex & 0XFF00) >> 8),(char)((ex & 0XFF0000) >> 16),(char)((ex & 0XFF000000) >> 24), 0};// Transform from int to char via Bitwise operators
cout<<"Codec: "<<ex<<endl;
VideoWriter videoWriter;
videoWriter.open(outputFilename,ex,15.0,size,true);
Я даже не уверен, что проблема связана с моим OpenCV или моим Ubuntu:/. (Я попытался открыть их, используя проигрыватель по умолчанию и vlc)
Поскольку я отказался от написания видео с помощью Opencv, я просто хочу упомянуть, как я решил свою проблему. После сохранения каждого изображения в виде файла png я использую ffmpeg из командной строки linux для записи последовательности изображений в виде видео.
Изображения называются последовательно следующим образом: 00001.png, 00002.png, 00003.png, [...]
Затем я использую эту команду
ffmpeg -i% 5d.png -vcodec mpeg4 test.avi