samples/cpp/tutorial_code/videoio/video-write/video-write.cpp


Check the corresponding tutorial 了解更多细节

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