本教程将教你如何使用 'dnn_superres' 接口通过预训练的神经网络对图像进行上采样。它适用于 C++ 和 Python。
构建
构建 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 版本中选中 dnn_superres 模块:cmake-gui。
示例的源代码
你可以通过以下方式运行示例代码
<path_of_your_opencv_build_directory>/bin/example_dnn_superres_dnn_superres <path_to_image.png> <algo_string> <upscale_int> <model_path.pb>
示例
/home/opencv/build/bin/example_dnn_superres_dnn_superres /home/image.png edsr 2 /home/EDSR_x2.pb
15using namespace dnn_superres;
17int main(
int argc,
char *argv[])
22 cout <<
"用法:参数 1:图像 | 图像路径" << endl;
23 cout <<
"\t 参数 2:算法 | 双线性、双三次、edsr、espcn、fsrcnn 或 lapsrn" << endl;
24 cout <<
"\t 参数 3:比例 | 2、3 或 4 \n";
25 cout <<
"\t 参数 4:模型文件路径 \n";
29 string img_path = string(argv[1]);
30 string algorithm = string(argv[2]);
31 int scale = atoi(argv[3]);
35 path = string(argv[4]);
39 Mat original_img(img);
42 std::cerr <<
"无法加载图像:" << img <<
"\n";
51 if( algorithm ==
"bilinear" ){
52 resize(img, img_new,
Size(), scale, scale, 2);
54 else if( algorithm ==
"bicubic" )
56 resize(img, img_new,
Size(), scale, scale, 3);
58 else if( algorithm ==
"edsr" || algorithm ==
"espcn" || algorithm ==
"fsrcnn" || algorithm ==
"lapsrn" )
61 sr.setModel(algorithm, scale);
62 sr.upsample(img, img_new);
65 std::cerr <<
"无法识别算法。\n";
68 if ( img_new.
empty() )
70 std::cerr <<
"上采样失败。\n";
bool empty() const
如果数组没有元素,则返回 true。
用于指定图像或矩形大小的模板类。
定义 types.hpp:335
void imshow(const String &winname, InputArray mat)
在指定的窗口中显示图像。
int waitKey(int delay=0)
等待按下键。
void namedWindow(const String &winname, int flags=WINDOW_AUTOSIZE)
创建窗口。
CV_EXPORTS_W Mat imread(const String &filename, int flags=IMREAD_COLOR)
从文件加载图像。
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3
与磁盘上的文件关联的文件存储的“黑盒”表示形式。
定义 core.hpp:102
解释
设置头文件和命名空间
using namespace dnn;
using namespace dnn_superres;
如果你想,你可以像上面的代码一样设置命名空间。
创建 Dnn 超分辨率对象
这只是为了创建对象、注册自定义 dnn 层并访问类函数。
读取模型
path = "models/FSRCNN_x2.pb"
sr.readModel(path);
这会从 .pb 文件中读取 TensorFlow 模型。这里 'path' 是预训练的 TensorFlow 模型之一的路径文件。你可以在 OpenCV 的 GitHub 中的 'dnn_superres' 模块中下载模型。
设置模型
sr.setModel("fsrcnn", 2);
根据你想要运行的模型,你必须设置算法和上采样因子。这是为了知道所需的算法和比例,即使你更改了 .pb 文件的名称。例如:如果你选择了 FSRCNN_x2.pb,你的算法和比例将分别为 'fsrcnn' 和 2。(其他算法选项包括“edsr”、“espcn”和“lapsrn”。)
对图像进行上采样
sr.upsample(img, img_new);
现在我们可以对任何图像进行上采样。通过标准的 'imread' 函数加载图像,并为目标图像创建一个新的 Mat。然后简单地进行上采样。你的上采样图像位于 'img_new' 中。
Python 中的示例
import cv2
from cv2 import dnn_superres
sr = dnn_superres.DnnSuperResImpl_create()
image = cv2.imread('./image.png')
path = "EDSR_x4.pb"
sr.readModel(path)
sr.setModel("edsr", 4)
result = sr.upsample(image)
cv2.imwrite("./upscaled.png", result)
原始图像:
通过 FSRCNN 上采样的图像:
通过双三次插值上采样的图像: