1 #include <iostream>
2 #include <iomanip>
3 #include <string>
4 #include <ctype.h>
5
6 #include "opencv2/core.hpp"
7 #include "opencv2/core/utility.hpp"
8 #include "opencv2/highgui.hpp"
9 #include "opencv2/imgproc.hpp"
10 #include "opencv2/superres.hpp"
11 #include "opencv2/superres/optical_flow.hpp"
12 #include "opencv2/opencv_modules.hpp"
13
14 #include "tick_meter.hpp"
15
16 using namespace std;
17 using namespace cv;
18 using namespace cv::superres;
19
20 #define MEASURE_TIME(op) \
21 { \
22 TickMeter tm; \
23 tm.start(); \
24 op; \
25 tm.stop(); \
26 cout << tm.getTimeSec() << " sec" << endl; \
27 }
28
createOptFlow(const string & name,bool useGpu)29 static Ptr<cv::superres::DenseOpticalFlowExt> createOptFlow(const string& name, bool useGpu)
30 {
31 if (name == "farneback")
32 {
33 if (useGpu)
34 return cv::superres::createOptFlow_Farneback_CUDA();
35 else
36 return cv::superres::createOptFlow_Farneback();
37 }
38 /*else if (name == "simple")
39 return createOptFlow_Simple();*/
40 else if (name == "tvl1")
41 {
42 if (useGpu)
43 return cv::superres::createOptFlow_DualTVL1_CUDA();
44 else
45 return cv::superres::createOptFlow_DualTVL1();
46 }
47 else if (name == "brox")
48 return cv::superres::createOptFlow_Brox_CUDA();
49 else if (name == "pyrlk")
50 return cv::superres::createOptFlow_PyrLK_CUDA();
51 else
52 cerr << "Incorrect Optical Flow algorithm - " << name << endl;
53
54 return Ptr<cv::superres::DenseOpticalFlowExt>();
55 }
56
main(int argc,const char * argv[])57 int main(int argc, const char* argv[])
58 {
59 CommandLineParser cmd(argc, argv,
60 "{ v video | | Input video }"
61 "{ o output | | Output video }"
62 "{ s scale | 4 | Scale factor }"
63 "{ i iterations | 180 | Iteration count }"
64 "{ t temporal | 4 | Radius of the temporal search area }"
65 "{ f flow | farneback | Optical flow algorithm (farneback, simple, tvl1, brox, pyrlk) }"
66 "{ g | false | CPU as default device, cuda for CUDA }"
67 "{ h help | false | Print help message }"
68 );
69
70 if (cmd.get<bool>("help"))
71 {
72 cout << "This sample demonstrates Super Resolution algorithms for video sequence" << endl;
73 cmd.printMessage();
74 return EXIT_SUCCESS;
75 }
76
77 const string inputVideoName = cmd.get<string>("video");
78 const string outputVideoName = cmd.get<string>("output");
79 const int scale = cmd.get<int>("scale");
80 const int iterations = cmd.get<int>("iterations");
81 const int temporalAreaRadius = cmd.get<int>("temporal");
82 const string optFlow = cmd.get<string>("flow");
83 string gpuOption = cmd.get<string>("gpu");
84
85 std::transform(gpuOption.begin(), gpuOption.end(), gpuOption.begin(), ::tolower);
86
87 bool useCuda = gpuOption.compare("cuda") == 0;
88 Ptr<SuperResolution> superRes;
89
90 if (useCuda)
91 superRes = createSuperResolution_BTVL1_CUDA();
92 else
93 superRes = createSuperResolution_BTVL1();
94
95 Ptr<cv::superres::DenseOpticalFlowExt> of = createOptFlow(optFlow, useCuda);
96
97 if (of.empty())
98 return EXIT_FAILURE;
99 superRes->setOpticalFlow(of);
100
101 superRes->setScale(scale);
102 superRes->setIterations(iterations);
103 superRes->setTemporalAreaRadius(temporalAreaRadius);
104
105 Ptr<FrameSource> frameSource;
106 if (useCuda)
107 {
108 // Try to use gpu Video Decoding
109 try
110 {
111 frameSource = createFrameSource_Video_CUDA(inputVideoName);
112 Mat frame;
113 frameSource->nextFrame(frame);
114 }
115 catch (const cv::Exception&)
116 {
117 frameSource.release();
118 }
119 }
120 if (!frameSource)
121 frameSource = createFrameSource_Video(inputVideoName);
122
123 // skip first frame, it is usually corrupted
124 {
125 Mat frame;
126 frameSource->nextFrame(frame);
127 cout << "Input : " << inputVideoName << " " << frame.size() << endl;
128 cout << "Scale factor : " << scale << endl;
129 cout << "Iterations : " << iterations << endl;
130 cout << "Temporal radius : " << temporalAreaRadius << endl;
131 cout << "Optical Flow : " << optFlow << endl;
132 cout << "Mode : " << (useCuda ? "CUDA" : "CPU") << endl;
133 }
134
135 superRes->setInput(frameSource);
136
137 VideoWriter writer;
138
139 for (int i = 0;; ++i)
140 {
141 cout << '[' << setw(3) << i << "] : ";
142 Mat result;
143
144 MEASURE_TIME(superRes->nextFrame(result));
145
146 if (result.empty())
147 break;
148
149 imshow("Super Resolution", result);
150
151 if (waitKey(1000) > 0)
152 break;
153
154 if (!outputVideoName.empty())
155 {
156 if (!writer.isOpened())
157 writer.open(outputVideoName, VideoWriter::fourcc('X', 'V', 'I', 'D'), 25.0, result.size());
158 writer << result;
159 }
160 }
161
162 return 0;
163 }
164