5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

C++ Opencvのdnn_superresを使ってお手軽超解像

Last updated at Posted at 2021-08-11

概要

opencv contribにあるdnn_superresを用いて超解像を触ってみる
モデルごとに計算速度に差があるかが気になったので処理時間も計測した
言語は問わないからとにかく超解像を試してみたい!という人は恐らくpythonで良いかと
初投稿なので拙い部分しかないと思いますがご容赦ください

環境

  • visual studio 2019 version 16.10.4
  • windows 10 home
  • opencv 4.5.3
  • C++14
  • gcc version 8.1.0

準備

  • visual stduio 2019はこちらからdlできます

  • opencv 4.5.3はこちらからdlできます

  • opencv 4.5.3の中にはdnn_superresは無いのでここから別途dlして使ってください

参考にしたページ

  • visual studioとopencv導入で参考にしました

  • opencv conrtib導入で参考にしました

  • コーディングで参考にしました

コード

まずはEDSRでやってみます
pathは環境に合わせて書き換えてください
モデルを変えたい場合はモデルパスを適宜書き換えてください

#include <iostream>
#include <windows.h>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/dnn_superres.hpp>

using namespace std;
using namespace cv;
using namespace dnn;
using namespace dnn_superres;

    // 超解像関数
Mat upscaleImage(Mat img, string model, string modelPath, int scale) {
	DnnSuperResImpl sr;
	Mat image_output;

	// 超解像モデルへのpath
	sr.readModel(modelPath);
	// 超解像モデル,スケールのセット
	sr.setModel(model, scale);
	
	// 画像出力
	sr.upsample(img, image_output);
	return (image_output);
}

int main(int argc, char* argv[])
{
	// 入力画像読み込み
	Mat img = imread("C:/~~.png");
	// 領域選択
	Rect roi;
	roi.x = 100;
	roi.y = 0;
	roi.width = img.size().width - 100;
	roi.height =300;
	img = img(roi);

	// 超解像モデル指定(EDSR_x4)
	string path = "C:/~~/EDSR_x4.pb";
	string model = "edsr";
	int scale = 4;

	// 処理時間計測開始
	DWORD start = GetTickCount64();

	// 超解像処理
	Mat result = upscaleImage(img, model, path, scale);

	// 計測終了
	DWORD end = GetTickCount64();

	// 比較用非超解像画像
	Mat normal_zoom;
	resize(img, normal_zoom, cv::Size(), scale, scale);

	// 出力画像保存
	imwrite("C:\~~\SR_upscaled.png", result);
	imwrite("C:\~~\Opencv_upscaled.png", normal_zoom);

	// 超解像結果,比較用画像,処理時間を出力
	imshow("Original", img);
	imshow("SR upscaled", result);
	imshow("Opencv_resized", normal_zoom);
	cout << "processing time = " << (double)(end - start) / 1000 / 60 << "minutes.\n";
	waitKey(0);
	destroyAllWindows();

	return (0);
}

EDSR

まずはオリジナルイメージです かわいいですね!
onepiece06_chopper.png

chopper_EDSR4x_zoom.png

chopper_EDSR4x_result.png

上がEDSR無しでズームした場合で,下がEDSRを用いた超解像結果です
角と背景の境界などがなめらかになっているのが見て取れますね
ちなみに自分の環境での処理時間は173.4sでした

FSRCNN

このくらいの画像だとFDSRとの違いはそこまで顕著ではないですね
ただ処理時間が0.345sととんでもなく短縮できてます

FSRCNN_horn.png

ESPCN

こちらも大きな違いは見当たりませんが,処理時間は0.234sと今回試したモデルの中では最短です
ESPCN_horn.png

感想

超解像を勉強していくために,とりあえず触ってみようと思って実装したのですが,
コーディングよりも環境構築に時間がかかるレベルのお手軽さでとても驚きました.先人に感謝です.
モデルごとの利点や大幅な処理時間の短縮はなぜ実現されているのかが気になるところ
FPGAに実装してみたいのでスクラッチ開発にも挑戦していきたい

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?