OpenCV  4.10.0
开源计算机视觉
加载中...
搜索中...
没有匹配项
提升视频的分辨率

在本教程中,你将学习如何利用「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 图形界面版本中勾选了 dnn_superres 模块:cmake-gui。

示例的源代码

1// 此文件是 OpenCV 项目的一部分。
2// 它遵循位于该发行包的顶级目录和 https://opencv.ac.cn/license.html 的 LICENSE 文件中的许可条款。
3// of this distribution and at https://opencv.ac.cn/license.html.
4
5#include <iostream>
6
8
9#include <opencv2/imgproc.hpp>
10#include <opencv2/highgui.hpp>
11
12using namespace std;
13using namespace cv;
14using namespace dnn_superres;
15
16int main(int argc, char *argv[])
17{
18 // 检查有效的命令行参数,如果参数数量不足,则打印用法。
19 // if insufficient arguments were given.
20 if (argc < 4) {
21 cout << "usage: Arg 1: input video path" << endl;
22 cout << "\t Arg 2: output video path" << endl;
23 cout << "\t Arg 3: 算法 | edsr、espcn、fsrcnn 或 lapsrn" << endl;
24 cout << "\t Arg 4: 比例 | 2、3、4 或 8 \n";
25 cout << "\t Arg 5: 模型文件路径 \n";
26 return -1;
27 }
28
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]);
34
35 VideoCapture input_video(input_path);
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);
39
40 VideoWriter output_video;
41 output_video.open(output_path, ex, input_video.get(CAP_PROP_FPS), S, true);
42
43 if (!input_video.isOpened())
44 {
45 std::cerr << "无法打开视频。" << std::endl;
46 return -1;
47 }
48
49 DnnSuperResImpl sr;
50 sr.readModel(path);
51 sr.setModel(algorithm, scale);
52
53 for(;;)
54 {
55 Mat frame, output_frame;
56 input_video >> frame;
57
58 如果 ( frame。empty() )
59 中断;
60
61 sr.upsample(frame, output_frame);
62 output_video << output_frame;
63
64 namedWindow("插值视频", WINDOW_AUTOSIZE);
65 imshow("插值视频", output_frame);
66
67 namedWindow("原始视频", WINDOW_AUTOSIZE);
68 imshow("原始视频", frame);
69
70 字符 c=(字符)waitKey(25);
71 如果(c==27)
72 中断;
73 }
74
75 input_video.release();
76 output_video.release();
77
78 返回 0;
79}
n 维密集数组类
定义 mat.hpp:812
bool empty() const
如果数组没有元素,则返回 true。
用于指定图像或矩形大小的模板类。
定义 types.hpp:335
类,用于从视频文件、图像序列或摄像头录制视频。
定义 videoio.hpp:731
视频写入器类。
定义 videoio.hpp:1009
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
文件上与磁盘上的文件存储关联的“黑盒子”表示。
定义 core.hpp:102
STL 命名空间。

说明

  1. 设置报头和命名空间
    using namespace std;
    using namespace cv;
    using namespace dnn_superres;
  2. 创建 Dnn Superres 对象
    DnnSuperResImpl sr;
    实例化一个 dnn 超分辨率对象。
  3. 读取模型
    path = "models/ESPCN_x2.pb"
    sr.readModel(path);
    sr.setModel("espcn", 2);
    从给定路径中读取模型,并设置算法和缩放因子。
  4. 放大视频
    对于(;;)
    {
    Mat frame, output_frame;
    input_video >> frame;
    if ( frame.empty() )
    中断;
    sr.upsample(frame, output_frame);
    ...
    }
    逐帧处理并放大视频。