在本教程中,您将学习如何使用“dnn_superres”接口通过预训练的神经网络来放大视频。
构建
构建 OpenCV 时,运行以下命令以构建所有 contrib 模块
cmake -D OPENCV_EXTRA_MODULES_PATH=<opencv_contrib>/modules/
或仅构建 dnn_superres 模块
cmake -D OPENCV_EXTRA_MODULES_PATH=<opencv_contrib>/modules/dnn_superres
或确保在 CMake 的 GUI 版本 cmake-gui 中选中 dnn_superres 模块。
示例的源代码
14using namespace dnn_superres;
16int main(
int argc,
char *argv[])
21 cout <<
"用法:参数 1:输入视频路径" << endl;
22 cout <<
"\t 参数 2:输出视频路径" << endl;
23 cout <<
"\t 参数 3:算法 | edsr、espcn、fsrcnn 或 lapsrn" << endl;
24 cout <<
"\t 参数 4:比例 | 2、3、4 或 8 \n";
25 cout <<
"\t 参数 5:模型文件路径 \n";
29 string input_path = string(argv[1]);
30 string output_path = string(argv[2]);
31 string algorithm = string(argv[3]);
32 int scale = atoi(argv[4]);
33 string path = string(argv[5]);
36 int ex =
static_cast<int>(input_video.get(CAP_PROP_FOURCC));
37 Size S =
Size((
int) input_video.get(CAP_PROP_FRAME_WIDTH) * scale,
38 (
int) input_video.get(CAP_PROP_FRAME_HEIGHT) * scale);
41 output_video.
open(output_path, ex, input_video.get(CAP_PROP_FPS), S,
true);
43 if (!input_video.isOpened())
45 std::cerr <<
"无法打开视频。" << std::endl;
51 sr.setModel(algorithm, scale);
55 Mat frame, output_frame;
61 sr.upsample(frame, output_frame);
62 output_video << output_frame;
64 namedWindow(
"放大后的视频", WINDOW_AUTOSIZE);
65 imshow(
"放大后的视频", output_frame);
67 namedWindow(
"原始视频", WINDOW_AUTOSIZE);
68 imshow(
"原始视频", frame);
70 char c=(char)waitKey(25);
75 input_video.release();
cv::getTickFrequency
double getTickFrequency()
用于指定图像或矩形大小的模板类。
Definition types.hpp:335
用于从视频文件、图像序列或相机捕获视频的类。
Definition videoio.hpp:772
视频写入类。
定义 videoio.hpp:1071
virtual bool open(const String &filename, int fourcc, double fps, Size frameSize, bool isColor=true)
初始化或重新初始化视频写入器。
virtual void release()
关闭视频写入器。
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3
说明
- 设置头文件和命名空间
using namespace dnn_superres;
- 创建 Dnn Superres 对象 实例化一个 dnn 超分辨率对象。
- 读取模型
path = "models/ESPCN_x2.pb"
sr.readModel(path);
sr.setModel("espcn", 2);
从给定路径读取模型并设置算法和缩放因子。
- 放大视频
for(;;)
{
input_video >> frame;
break;
sr.upsample(frame, output_frame);
...
}
逐帧处理和放大视频。