datahacker.rs@gmail.com

OpenCV #002 Read, Display and Save Videos

OpenCV #002 Read, Display and Save Videos

Digital Image Processing using OpenCV (Python & C++)

Highlight: In this blog post we will explain how to read, display and save videos using OpenCV. We will give a code both in Python and C++.

Tutorial Overview:

  1. Reading a video (Python & C++)
  2. Displaying a video (Python & C++)
  3. Saving a video (Python & C++)

1. Reading a video

Reading a video frame and displaying it, is not as difficult, as one might think. Using OpenCV it can be done in two ways, either by reading a video file or using the video stream directly from a camera connected to your computer. The first approach towards reading a video file is creating a VideoCapture Object and we need to specify the video filename. The second approach needs cameras parameters to access its real-time video stream.

Let’s imagine that you want to read a video from your camera. As everyone has most likely one camera, it will be indexed with ‘0’ and if more ‘1’, ‘2’ and so on. To make this more clear the code snippet below would clarify any doubts.

Python

C++

// Create a VideoCapture object and pass 0

VideoCapture cap(0); 

On the other hand, when we want to load an mp4 file, the parameter you are going to pass in is the absolute or relative path to the file.

In the following lines, you are going to see how to work with Python and C++, when working with video files.

Python

C++

// Create a VideoCapture object and open the input file

VideoCapture cap("game_of_throne_trailer.mp4"); 

Now, after the VideoCapture object is created, a video can be captured frame by frame.

2. Displaying a video

When working with video files, reading a video file or capturing live stream is not enough. We also want to process the video and display it. To display a video in an open window, OpenCV provides a very simple interface to do this, using the command cv2.imshow in Python or cv::imshow in C++.

Python

C++

#include "opencv2/opencv.hpp"
#include <iostream>
 
using namespace std;
using namespace cv;

int main(){
 
  // Create a VideoCapture object and open the input file
  VideoCapture cap("game_of_throne_trailer.mp4"); 
    
  // Check if camera opened successfully
  if(!cap.isOpened()){
    cout << "Error opening video stream or file" << endl;
    return -1;
  }
     
  while(1){
 
    Mat frame;
    // Capture frame-by-frame
    cap >> frame;
  
    // If the frame is empty, break immediately
    if (frame.empty())
      break;
 
    // Display the resulting frame
    imshow( "Frame", frame );
 
    // Press  ESC on keyboard to exit
    char c=(char)waitKey(25);
    if(c==27)
      break;
  }
  
  // When everything done, release the video capture object
  cap.release();
 
  // Closes all the frames
  destroyAllWindows();
     
  return 0;
}

3. Writing a video

As the next step, we want to save the captured frames as a video file. First, in order to be able to write our file, a Video Writer object must be created. This object takes as input parameters the output file name. It is worth mentioning that Fourcc (4-character code of codec) is used to compress the frames. More details related to this code type you can find here. Another parameter when we save video files is frame per second (fps), which controls how many frames you want to show per second in the output video. Finally, the frame size is also passed, which the width and height have been denoted. Implementations both in Python and C++ are below.

Python

C++

// Define the codec and create VideoWriter object.The output is stored in 'output.avi' file.
// Define the fps to be equal to 10. Also frame size is passed.
 
  VideoWriter video("output_cpp.avi", CV_FOURCC('M','J','P','G'),10, Size(frame_width,frame_height));
// For Windows users use "cv::VideoWritter::fourcc" instead of "CV_FOURCC"

So now we will merge everything into one big script.

Python

C++

#include "opencv2/opencv.hpp"
#include <iostream>
 
using namespace std;
using namespace cv;
 
int main(){
 
  // Create a VideoCapture object and use camera to capture the video
  VideoCapture cap(0); 
 
  // Check if camera opened successfully
  if(!cap.isOpened())
  {
    cout << "Error opening video stream" << endl; 
    return -1; 
  } 
 
  // Default resolution of the frame is obtained.The default resolution is system dependent. 
  int frame_width = cap.get(CAP_PROP_FRAME_WIDTH); 
  int frame_height = cap.get(CAP_PROP_FRAME_HEIGHT); 
   
  // Define the codec and create VideoWriter object.The output is stored in 'output_cpp.avi' file. 
  VideoWriter video("output_cpp.avi",CV_FOURCC('M','J','P','G'),10, Size(frame_width,frame_height));  // For Windows users use "cv::VideoWritter::fourcc" instead of "CV_FOURCC"
  while(1)
  { 
    Mat frame; 
     
    // Capture frame-by-frame 
    cap >> frame;
  
    // If the frame is empty, break immediately
    if (frame.empty())
      break;
     
    // Write the frame into the file 'output_cpp.avi'
    video.write(frame);
    
    // Display the resulting frame    
    imshow( "Frame", frame );
  
    // Press  ESC on keyboard to  exit
    char c = (char)waitKey(1);
    if( c == 27 ) 
      break;
  }
 
  // When everything done, release the video capture and write object
  cap.release();
  video.release();
 
  // Closes all the windows
  destroyAllWindows();
  return 0;
}

Summary

Congrats! In this post, we have successfully completed how to read, display and write a video file. In the next tutorial, we will focus on other image processing techniques.

More resources on the topic:

 

Leave a Reply

Your email address will not be published. Required fields are marked *

four × 4 =