mirror of https://github.com/opencv/opencv.git
Open Source Computer Vision Library
https://opencv.org/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
3.4 KiB
95 lines
3.4 KiB
#include <iostream> // for standard I/O |
|
#include <string> // for strings |
|
|
|
#include <opencv2/core.hpp> // Basic OpenCV structures (cv::Mat) |
|
#include <opencv2/videoio.hpp> // Video write |
|
|
|
using namespace std; |
|
using namespace cv; |
|
|
|
static void help() |
|
{ |
|
cout |
|
<< "------------------------------------------------------------------------------" << endl |
|
<< "This program shows how to write video files." << endl |
|
<< "You can extract the R or G or B color channel of the input video." << endl |
|
<< "Usage:" << endl |
|
<< "./video-write <input_video_name> [ R | G | B] [Y | N]" << endl |
|
<< "------------------------------------------------------------------------------" << endl |
|
<< endl; |
|
} |
|
|
|
int main(int argc, char *argv[]) |
|
{ |
|
help(); |
|
|
|
if (argc != 4) |
|
{ |
|
cout << "Not enough parameters" << endl; |
|
return -1; |
|
} |
|
|
|
const string source = argv[1]; // the source file name |
|
const bool askOutputType = argv[3][0] =='Y'; // If false it will use the inputs codec type |
|
|
|
VideoCapture inputVideo(source); // Open input |
|
if (!inputVideo.isOpened()) |
|
{ |
|
cout << "Could not open the input video: " << source << endl; |
|
return -1; |
|
} |
|
|
|
string::size_type pAt = source.find_last_of('.'); // Find extension point |
|
const string NAME = source.substr(0, pAt) + argv[2][0] + ".avi"; // Form the new name with container |
|
int ex = static_cast<int>(inputVideo.get(CAP_PROP_FOURCC)); // Get Codec Type- Int form |
|
|
|
// Transform from int to char via Bitwise operators |
|
char EXT[] = {(char)(ex & 0XFF) , (char)((ex & 0XFF00) >> 8),(char)((ex & 0XFF0000) >> 16),(char)((ex & 0XFF000000) >> 24), 0}; |
|
|
|
Size S = Size((int) inputVideo.get(CAP_PROP_FRAME_WIDTH), // Acquire input size |
|
(int) inputVideo.get(CAP_PROP_FRAME_HEIGHT)); |
|
|
|
VideoWriter outputVideo; // Open the output |
|
if (askOutputType) |
|
outputVideo.open(NAME, ex=-1, inputVideo.get(CAP_PROP_FPS), S, true); |
|
else |
|
outputVideo.open(NAME, ex, inputVideo.get(CAP_PROP_FPS), S, true); |
|
|
|
if (!outputVideo.isOpened()) |
|
{ |
|
cout << "Could not open the output video for write: " << source << endl; |
|
return -1; |
|
} |
|
|
|
cout << "Input frame resolution: Width=" << S.width << " Height=" << S.height |
|
<< " of nr#: " << inputVideo.get(CAP_PROP_FRAME_COUNT) << endl; |
|
cout << "Input codec type: " << EXT << endl; |
|
|
|
int channel = 2; // Select the channel to save |
|
switch(argv[2][0]) |
|
{ |
|
case 'R' : channel = 2; break; |
|
case 'G' : channel = 1; break; |
|
case 'B' : channel = 0; break; |
|
} |
|
Mat src, res; |
|
vector<Mat> spl; |
|
|
|
for(;;) //Show the image captured in the window and repeat |
|
{ |
|
inputVideo >> src; // read |
|
if (src.empty()) break; // check if at end |
|
|
|
split(src, spl); // process - extract only the correct channel |
|
for (int i =0; i < 3; ++i) |
|
if (i != channel) |
|
spl[i] = Mat::zeros(S, spl[0].type()); |
|
merge(spl, res); |
|
|
|
//outputVideo.write(res); //save or |
|
outputVideo << res; |
|
} |
|
|
|
cout << "Finished writing" << endl; |
|
return 0; |
|
}
|
|
|