From bdfc0201de93f8c0969da7319b8d256f034525c1 Mon Sep 17 00:00:00 2001 From: Bernat Gabor Date: Sat, 13 Aug 2011 14:02:18 +0000 Subject: [PATCH] Added the How to create videos with OpenCV Tutorial. Made some corrections to the feature2d, to get rid of some documentation build errors. --- .../table_of_content_features2d.rst | 6 +- .../good_features_to_track.rst | 18 ++-- .../images/video-write.png | Bin 0 -> 7400 bytes .../table_of_content_highgui.rst | 20 ++++ .../video-input-psnr-ssim.rst | 2 +- .../images/resultOutputWideoWrite.png | Bin 0 -> 40188 bytes .../images/videoCompressSelect.png | Bin 0 -> 7397 bytes .../video-write/images/videoFileStructure.png | Bin 0 -> 12453 bytes .../highgui/video-write/video-write.rst | 1 + .../HighGUI/video-write/video-write.cpp | 97 ++++++++++++++++++ 10 files changed, 133 insertions(+), 11 deletions(-) create mode 100644 doc/tutorials/highgui/table_of_content_highgui/images/video-write.png create mode 100644 doc/tutorials/highgui/video-write/images/resultOutputWideoWrite.png create mode 100644 doc/tutorials/highgui/video-write/images/videoCompressSelect.png create mode 100644 doc/tutorials/highgui/video-write/images/videoFileStructure.png create mode 100644 doc/tutorials/highgui/video-write/video-write.rst create mode 100644 samples/cpp/tutorial_code/HighGUI/video-write/video-write.cpp diff --git a/doc/tutorials/features2d/table_of_content_features2d/table_of_content_features2d.rst b/doc/tutorials/features2d/table_of_content_features2d/table_of_content_features2d.rst index e41dee936e..bfaf9b0a7c 100644 --- a/doc/tutorials/features2d/table_of_content_features2d/table_of_content_features2d.rst +++ b/doc/tutorials/features2d/table_of_content_features2d/table_of_content_features2d.rst @@ -3,7 +3,7 @@ *feature2d* module. 2D Features framework ----------------------------------------------------------- -Learn about how to use the feature points detectors, descriptors and matching framework found inside OpenCV.ddddddd +Learn about how to use the feature points detectors, descriptors and matching framework found inside OpenCV. .. include:: ../../definitions/tocDefinitions.rst @@ -190,7 +190,11 @@ Learn about how to use the feature points detectors, descriptors and matching f .. toctree:: :hidden: + ../feature_description/feature_description + ../feature_detection/feature_detection ../trackingmotion/harris_detector/harris_detector + ../feature_flann_matcher/feature_flann_matcher + ../feature_homography/feature_homography ../trackingmotion/good_features_to_track/good_features_to_track.rst ../trackingmotion/generic_corner_detector/generic_corner_detector ../trackingmotion/corner_subpixeles/corner_subpixeles diff --git a/doc/tutorials/features2d/trackingmotion/good_features_to_track/good_features_to_track.rst b/doc/tutorials/features2d/trackingmotion/good_features_to_track/good_features_to_track.rst index 00782364b2..7fad76e13a 100644 --- a/doc/tutorials/features2d/trackingmotion/good_features_to_track/good_features_to_track.rst +++ b/doc/tutorials/features2d/trackingmotion/good_features_to_track/good_features_to_track.rst @@ -88,14 +88,14 @@ This tutorial code's is shown lines below. You can also download it from `here < /// Apply corner detection goodFeaturesToTrack( src_gray, - corners, - maxCorners, - qualityLevel, - minDistance, - Mat(), - blockSize, - useHarrisDetector, - k ); + corners, + maxCorners, + qualityLevel, + minDistance, + Mat(), + blockSize, + useHarrisDetector, + k ); /// Draw corners detected @@ -116,7 +116,7 @@ Explanation Result ====== -.. image:: images/Shi_Tomasi_Detector_Result.jpg +.. image:: images/Feature_Detection_Result_a.jpg :align: center diff --git a/doc/tutorials/highgui/table_of_content_highgui/images/video-write.png b/doc/tutorials/highgui/table_of_content_highgui/images/video-write.png new file mode 100644 index 0000000000000000000000000000000000000000..9413d80836cfdef73e6b8c2326ff48140a2badbc GIT binary patch literal 7400 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 OpenCV 2.0 + + *Author:* |Author_BernatG| + + Whenever you work with video feeds you may eventually want to save your image processing result in a form of a new video file. Here's how to do it. + + =============== ====================================================== + + .. |hVideoWrite| image:: images/video-write.png + :height: 90pt + :width: 90pt + + .. raw:: latex \pagebreak diff --git a/doc/tutorials/highgui/video-input-psnr-ssim/video-input-psnr-ssim.rst b/doc/tutorials/highgui/video-input-psnr-ssim/video-input-psnr-ssim.rst index 4bde0be6bb..cb45a5b0a3 100644 --- a/doc/tutorials/highgui/video-input-psnr-ssim/video-input-psnr-ssim.rst +++ b/doc/tutorials/highgui/video-input-psnr-ssim/video-input-psnr-ssim.rst @@ -18,7 +18,7 @@ The source code As a test case where to show off these using OpenCV I've created a small program that reads in two video files and performs a similarity check between them. This is something you could use to check just how well a new video compressing algorithms works. Let there be a reference (original) video like :download:`this small Megamind clip <../../../../samples/cpp/tutorial_code/highgui/video-input-psnr-ssim/video/Megamind.avi>` and :download:`a compressed version of it <../../../../samples/cpp/tutorial_code/highgui/video-input-psnr-ssim/video/Megamind_bugy.avi>`. You may also find the source code and these video file in the :file:`samples/cpp/tutorial_code/highgui/video-input-psnr-ssim/` folder of the OpenCV source library. -.. literalinclude:: ../../../../samples/cpp/tutorial_code/HighGUI\video-input-psnr-ssim\video-input-psnr-ssim.cpp +.. literalinclude:: ../../../../samples/cpp/tutorial_code/HighGUI/video-input-psnr-ssim/video-input-psnr-ssim.cpp :language: cpp :linenos: :tab-width: 4 diff --git a/doc/tutorials/highgui/video-write/images/resultOutputWideoWrite.png b/doc/tutorials/highgui/video-write/images/resultOutputWideoWrite.png new file mode 100644 index 0000000000000000000000000000000000000000..bea15a35bdaf309be2082c14755133a6a9640923 GIT binary patch literal 40188 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 M07*qoM6N<$g4qOe?EnA( literal 0 HcmV?d00001 diff --git a/doc/tutorials/highgui/video-write/images/videoCompressSelect.png b/doc/tutorials/highgui/video-write/images/videoCompressSelect.png new file mode 100644 index 0000000000000000000000000000000000000000..a72fc01c3103fe0d03679dd3812fb265508a31f1 GIT binary patch literal 7397 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 literal 0 HcmV?d00001 diff --git a/doc/tutorials/highgui/video-write/video-write.rst b/doc/tutorials/highgui/video-write/video-write.rst new file mode 100644 index 0000000000..0bebf82381 --- /dev/null +++ b/doc/tutorials/highgui/video-write/video-write.rst @@ -0,0 +1 @@ +.. _videoWriteHighGui: Creating a video with OpenCV **************************** Goal ==== Whenever you work with video feeds you may eventually want to save your image processing result in a form of a new video file. For simple video outputs you can use the OpenCV built-in :huivideo:`VideoWriter ` class, designed for this. .. container:: enumeratevisibleitemswithsquare + How to create a video file with OpenCV + What type of video files you can create with OpenCV + How to extract a given color channel from a video As a simple demonstration I'll just extract one of the RGB color channels of an input video file into a new video. You can control the flow of the application from its console line arguments: .. container:: enumeratevisibleitemswithsquare + The first argument points to the video file to work on + The second argument may be one of the characters: R G B. This will specify which of the channels to extract. + The last argument is the character Y (Yes) or N (No). If this is no, the codec used for the input video file will be the same as for the output. Otherwise, a window will pop up and allow you to select yourself the codec to use. For example, a valid command line would look like: .. code-block:: bash video-write.exe video/Megamind.avi R Y The source code =============== You may also find the source code and these video file in the :file:`samples/cpp/tutorial_code/highgui/video-write/` folder of the OpenCV source library or :download:`download it from here <../../../../samples/cpp/tutorial_code/HighGUI/video-write/video-write.cpp>`. .. literalinclude:: ../../../../samples/cpp/tutorial_code/HighGUI/video-write/video-write.cpp :language: cpp :linenos: :tab-width: 4 :lines: 1-8, 21-22, 24-97 The structure of a video ======================== For start, you should have an idea of just how a video file looks. Every video file in itself is a container. The type of the container is expressed in the files extension (for example *avi*, *mov* or *mkv*). This contains multiple elements like: video feeds, audio feeds or other tracks (like for example subtitles). How these feeds are stored is determined by the codec used for each one of them. In case of the audio tracks commonly used codecs are *mp3* or *aac*. For the video files the list is somehow longer and includes names such as *XVID*, *DIVX*, *H264* or *LAGS* (*Lagarith Lossless Codec*). The full list of codecs you may use on a system depends on just what one you have installed. .. image:: images/videoFileStructure.png :alt: The Structure of the video :align: center As you can see things can get really complicated with videos. However, OpenCV is mainly a computer vision library, not a video stream, codec and write one. Therefore, the developers tried to keep this part as simple as possible. Due to this OpenCV for video containers supports only the *avi* extension, its first version. A direct limitation of this is that you cannot save a video file larger than 2 GB. Furthermore you can only create and expand a single video track inside the container. No audio or other track editing support here. Nevertheless, any video codec present on your system might work. If you encounter some of these limitations you will need to look into more specialized video writing libraries such as *FFMpeg* or codecs as *HuffYUV*, *CorePNG* and *LCL*. As an alternative, create the video track with OpenCV and expand it with sound tracks or convert it to other formats by using video manipulation programs such as *VirtualDub* or *AviSynth*. The *VideoWriter* class ======================= The content written here builds on the assumption you already read the :ref:`videoInputPSNRMSSIM` tutorial and you know how to read video files. To create a video file you just need to create an instance of the :huivideo:`VideoWriter ` class. You can specify its properties either via parameters in the constructor or later on via the :huivideo:`open ` function. Either way, the parameters are the same: 1. The name of the output that contains the container type in its extension. At the moment only *avi* is supported. We construct this from the input file, add to this the name of the channel to use, and finish it off with the container extension. .. code-block:: cpp const string source = argv[1]; // the source file name 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 #. The codec to use for the video track. Now all the video codecs have a unique short name of maximum four characters. Hence, the *XVID*, *DIVX* or *H264* names. This is called a four character code. You may also ask this from an input video by using its *get* function. Because the *get* function is a general function it always returns double values. A double value is stored on 64 bits. Four characters are four bytes, meaning 32 bits. These four characters are coded in the lower 32 bits of the *double*. A simple way to throw away the upper 32 bits would be to just convert this value to *int*: .. code-block:: cpp VideoCapture inputVideo(source); // Open input int ex = static_cast(inputVideo.get(CV_CAP_PROP_FOURCC)); // Get Codec Type- Int form OpenCV internally works with this integer type and expect this as its second parameter. Now to convert from the integer form to string we may use two methods: a bitwise operator and a union method. The first one extracting from an int the characters looks like (an "and" operation, some shifting and adding a 0 at the end to close the string): .. code-block:: cpp char EXT[] = {ex & 0XFF , (ex & 0XFF00) >> 8,(ex & 0XFF0000) >> 16,(ex & 0XFF000000) >> 24, 0}; You can do the same thing with the *union* as: .. code-block:: cpp union { int v; char c[5];} uEx ; uEx.v = ex; // From Int to char via union uEx.c[4]='\0'; The advantage of this is that the conversion is done automatically after assigning, while for the bitwise operator you need to do the operations whenever you change the codec type. In case you know the codecs four character code beforehand, you can use the *CV_FOURCC* macro to build the integer: .. code-block::cpp CV_FOURCC('P','I','M,'1') // this is an MPEG1 codec from the characters to integer If you pass for this argument minus one than a window will pop up at runtime that contains all the codec installed on your system and ask you to select the one to use: .. image:: images/videoCompressSelect.png :alt: Select the codec type to use :align: center #. The frame per second for the output video. Again, here I keep the input videos frame per second by using the *get* function. #. The size of the frames for the output video. Here too I keep the input videos frame size per second by using the *get* function. #. The final argument is an optional one. By default is true and says that the output will be a colorful one (so for write you will send three channel images). To create a gray scale video pass a false parameter here. Here it is, how I use it in the sample: .. code-block:: cpp VideoWriter outputVideo; Size S = Size((int) inputVideo.get(CV_CAP_PROP_FRAME_WIDTH), //Acquire input size (int) inputVideo.get(CV_CAP_PROP_FRAME_HEIGHT)); outputVideo.open(NAME , ex, inputVideo.get(CV_CAP_PROP_FPS),S, true); Afterwards, you use the :huivideo:`isOpened() ` function to find out if the open operation succeeded or not. The video file automatically closes when the *VideoWriter* object is destroyed. After you open the object with success you can send the frames of the video in a sequential order by using the :huivideo:`write` function of the class. Alternatively, you can use its overloaded operator << : .. code-block:: cpp outputVideo.write(res); //or outputVideo << res; Extracting a color channel from an RGB image means to set to zero the RGB values of the other channels. You can either do this with image scanning operations or by using the split and merge operations. You first split the channels up into different images, set the other channels to zero images of the same size and type and finally merge them back: .. code-block:: cpp 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); Put all this together and you'll get the upper source code, whose runtime result will show something around the idea: .. image:: images/resultOutputWideoWrite.png :alt: A sample output :align: center You may observe a runtime instance of this on the `YouTube here `_. .. raw:: html
\ No newline at end of file diff --git a/samples/cpp/tutorial_code/HighGUI/video-write/video-write.cpp b/samples/cpp/tutorial_code/HighGUI/video-write/video-write.cpp new file mode 100644 index 0000000000..824dd71dc2 --- /dev/null +++ b/samples/cpp/tutorial_code/HighGUI/video-write/video-write.cpp @@ -0,0 +1,97 @@ +#include // for standard I/O +#include // for strings + +#include // Basic OpenCV structures (cv::Mat) +#include // Video write + +using namespace std; +using namespace cv; + +void help() +{ + cout + << "\n--------------------------------------------------------------------------" << endl + << "This program shows how to write video files. You can extract the R or G or B color channel " + << " of the input video.write " << endl + << "Usage:" << endl + << "./video-write inputvideoName [ R | G | B] [Y | N]" << endl + << "--------------------------------------------------------------------------" << endl + << endl; +} +int main(int argc, char *argv[], char *window_name) +{ + 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(inputVideo.get(CV_CAP_PROP_FOURCC)); // Get Codec Type- Int form + + // Transform from int to char via Bitwise operators + char EXT[] = {ex & 0XFF , (ex & 0XFF00) >> 8,(ex & 0XFF0000) >> 16,(ex & 0XFF000000) >> 24, 0}; + + Size S = Size((int) inputVideo.get(CV_CAP_PROP_FRAME_WIDTH), //Acquire input size + (int) inputVideo.get(CV_CAP_PROP_FRAME_HEIGHT)); + + VideoWriter outputVideo; // Open the output + if (askOutputType) + outputVideo.open(NAME , ex=-1, inputVideo.get(CV_CAP_PROP_FPS),S, true); + else + outputVideo.open(NAME , ex, inputVideo.get(CV_CAP_PROP_FPS),S, true); + + if (!outputVideo.isOpened()) + { + cout << "Could not open the output video for write: " << source << endl; + return -1; + } + + union { int v; char c[5];} uEx ; + uEx.v = ex; // From Int to char via union + uEx.c[4]='\0'; + + cout << "Input frame resolution: Width=" << S.width << " Height=" << S.height + << " of nr#: " << inputVideo.get(CV_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 spl; + + while( true) //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; +} \ No newline at end of file