本教程将指导您如何使用 '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 版本 (cmake-gui) 中确保选中 dnn_superres 模块。
示例代码
您可以通过以下命令运行示例代码:
<opencv_构建目录路径>/bin/example_dnn_superres_dnn_superres <图像路径.png> <算法字符串> <放大倍数> <模型路径.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:算法 | bilinear, bicubic, 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";
73 cout <<
"超分辨率处理成功。\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_BGR)
从文件加载图像。
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3
解释
设置头文件和命名空间
using namespace dnn;
using namespace dnn_superres;
如果需要,您可以像上面的代码一样设置命名空间。
创建Dnn Superres对象
这只是为了创建对象,注册自定义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放大后的图像:
通过双三次插值放大后的图像: