OpenCV videoWriter codec issue
I have a problem with many codecs on windows. I have installed ffmpeg correctly, but still there is a problem with many video format.
Try this one CV_FOURCC('W', 'M', 'V', '2')
VideoWriter video("Result.wmv", CV_FOURCC('W', 'M', 'V', '2'), 30, SizeOfFrame, true);
WMV is awful format but works perfect for me. I am working with Visual Studio 2015 and my own build of Opencv 3.0.0.
In Opencv 3.0.0, I can strongly recommend include also
#include "opencv2/imgcodecs/imgcodecs.hpp"
#include "opencv2/videoio/videoio.hpp"
There is anoter recommandation. Check size of input video and size of VideoWriter. CV_CAP_PROP_FRAME_WIDTH and CV_CAP_PROP_FRAME_HEIGHT in some cases return wrong values. Check both sizes before video.write(Mat)
You can check your video writer by this loop. Set your writer sizes as dummy constant.
Size SizeOfFrame = cv::Size( 800, 600);
VideoWriter video("Result.wmv", CV_FOURCC('W', 'M', 'V', '2'), 30, SizeOfFrame, true);
In video loop resize retrieved video to same size as writer. If this fail your installation is probably wrong.
for (;;)
{
bool Is = cap.grab();
if (Is == false) {
cout << "cannot grab video frame" << endl;
}
else {
cap.retrieve(LoadedImage, CV_CAP_OPENNI_BGR_IMAGE);
resize(LoadedImage, LoadedImage, Size(800, 600));
video.write(LoadedImage);
}
}
Rupert Cobbe-Warburton
Updated on June 04, 2022Comments
-
Rupert Cobbe-Warburton almost 2 years
I am trying to write a video in OpenCV in Windows and am meeting various issues when choosing codecs. I'm not sure if it is something in my code or I do not have the codecs necessary. The code is:
int main(int argc, char ** argv){ VideoCapture inputVideo("LFW.mp4"); Mat inputFrame, outputFrame; VideoWriter outputVideo; if (!inputVideo.isOpened()){ std::cout << "!!! Input video could not be opened" << std::endl; return 1; } int ex = static_cast<int>(inputVideo.get(CV_CAP_PROP_FOURCC)); const string name = "Output.mp4"; Size size = Size((int) inputVideo.get(CV_CAP_PROP_FRAME_WIDTH), (int) inputVideo.get(CV_CAP_PROP_FRAME_HEIGHT)); outputVideo.open(name, CV_FOURCC('M','P','4','2'), inputVideo.get(CV_CAP_PROP_FPS), size, true); if (!outputVideo.isOpened()){ std::cout << "!!! Output video could not be opened" << std::endl; return 2; } return 0; }
The code keeps exiting with code 2, therefore the videoWriter object is not happy with its configuration.