OpenCV videoWriter codec issue

17,698

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

My Tutorial here

Share:
17,698
Rupert Cobbe-Warburton
Author by

Rupert Cobbe-Warburton

Updated on June 04, 2022

Comments

  • Rupert Cobbe-Warburton
    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.