Home | History | Annotate | Download | only in video-write
      1 #include <iostream>	// for standard I/O
      2 #include <string>   // for strings
      3 
      4 #include <opencv2/core/core.hpp>        // Basic OpenCV structures (cv::Mat)
      5 #include <opencv2/videoio/videoio.hpp>  // Video write
      6 
      7 using namespace std;
      8 using namespace cv;
      9 
     10 static void help()
     11 {
     12     cout
     13         << "------------------------------------------------------------------------------" << endl
     14         << "This program shows how to write video files."                                   << endl
     15         << "You can extract the R or G or B color channel of the input video."              << endl
     16         << "Usage:"                                                                         << endl
     17         << "./video-write inputvideoName [ R | G | B] [Y | N]"                              << endl
     18         << "------------------------------------------------------------------------------" << endl
     19         << endl;
     20 }
     21 
     22 int main(int argc, char *argv[])
     23 {
     24     help();
     25 
     26     if (argc != 4)
     27     {
     28         cout << "Not enough parameters" << endl;
     29         return -1;
     30     }
     31 
     32     const string source      = argv[1];           // the source file name
     33     const bool askOutputType = argv[3][0] =='Y';  // If false it will use the inputs codec type
     34 
     35     VideoCapture inputVideo(source);              // Open input
     36     if (!inputVideo.isOpened())
     37     {
     38         cout  << "Could not open the input video: " << source << endl;
     39         return -1;
     40     }
     41 
     42     string::size_type pAt = source.find_last_of('.');                  // Find extension point
     43     const string NAME = source.substr(0, pAt) + argv[2][0] + ".avi";   // Form the new name with container
     44     int ex = static_cast<int>(inputVideo.get(CAP_PROP_FOURCC));     // Get Codec Type- Int form
     45 
     46     // Transform from int to char via Bitwise operators
     47     char EXT[] = {(char)(ex & 0XFF) , (char)((ex & 0XFF00) >> 8),(char)((ex & 0XFF0000) >> 16),(char)((ex & 0XFF000000) >> 24), 0};
     48 
     49     Size S = Size((int) inputVideo.get(CAP_PROP_FRAME_WIDTH),    // Acquire input size
     50                   (int) inputVideo.get(CAP_PROP_FRAME_HEIGHT));
     51 
     52     VideoWriter outputVideo;                                        // Open the output
     53     if (askOutputType)
     54         outputVideo.open(NAME, ex=-1, inputVideo.get(CAP_PROP_FPS), S, true);
     55     else
     56         outputVideo.open(NAME, ex, inputVideo.get(CAP_PROP_FPS), S, true);
     57 
     58     if (!outputVideo.isOpened())
     59     {
     60         cout  << "Could not open the output video for write: " << source << endl;
     61         return -1;
     62     }
     63 
     64     cout << "Input frame resolution: Width=" << S.width << "  Height=" << S.height
     65          << " of nr#: " << inputVideo.get(CAP_PROP_FRAME_COUNT) << endl;
     66     cout << "Input codec type: " << EXT << endl;
     67 
     68     int channel = 2; // Select the channel to save
     69     switch(argv[2][0])
     70     {
     71     case 'R' : channel = 2; break;
     72     case 'G' : channel = 1; break;
     73     case 'B' : channel = 0; break;
     74     }
     75     Mat src, res;
     76     vector<Mat> spl;
     77 
     78     for(;;) //Show the image captured in the window and repeat
     79     {
     80         inputVideo >> src;              // read
     81         if (src.empty()) break;         // check if at end
     82 
     83         split(src, spl);                // process - extract only the correct channel
     84         for (int i =0; i < 3; ++i)
     85             if (i != channel)
     86                 spl[i] = Mat::zeros(S, spl[0].type());
     87        merge(spl, res);
     88 
     89        //outputVideo.write(res); //save or
     90        outputVideo << res;
     91     }
     92 
     93     cout << "Finished writing" << endl;
     94     return 0;
     95 }
     96