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