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
help()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
main(int argc,char * argv[])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