趣味は車輪の再発明♪

[opencv] SuperResolutionで動画の超解像を行う


詳解 OpenCV ―コンピュータビジョンライブラリを使った画像処理・認識
Gary Bradski Adrian Kaehler
オライリージャパン
売り上げランキング: 25,746


■ たかみんつ / ソフト開発メモINDEX / OpenCVリファレンス(じぶん用) / 関数・クラスの使い方・サンプルなど /


OpenCV 2.4.8 の cv::superres::SuperResolutionを使って、動画の超解像を生成するサンプルプログラムです。 特殊なことをしない限り、このクラスを使用すれば問題はなさそうです。

入力した元動画と超解像結果の画像をリアルタイムに再生します。

以下のサンプルプログラムでは、解像度を縦横2倍(面積的には4倍)に上げています(これはプログラム11行目rfactor=2の部分)。 また、超解像アルゴリズムの繰り返し演算の回数を4回に設定(12行目iteration=4の部分)していますが、これはこのクラスの既定値である180回に比べると、極端に少ない値ですので、超解像の効果はあまり期待できないと思います。

使い方

  • あらかじめ入力動画 (Wildlife_120x90.avi) をダウンロードしてカレントディレクトリに配置してください。
  • 実行すると、動画の再生が始まります。2つのウィンドウが表示され、片方は元の画像、もう一方は超解像です。
  • 再生中に、ESCキーを入力すると一時停止します。続けてもう一度ESCを入力すると終了します。それ以外のキー入力では再生を再開します。

※ 低解像度の入力動画を作成するために、動画をリサイズするサンプルプログラムが 使用できます。

実行中画面

以下、左側が元の動画のフレーム。左が超解像の画像です。超解像は上下左右が少しカットされて小さくなっています。クリックすると拡大表示されます。

実行中画面1
砂浜を走る馬の群れ。左が入力画像で右が超解像

実行中画面2
風にそよぐ草花がうまく解像度が上がっています。左が入力画像で右が超解像

ソースファイル(Microsoft Visual C++ 2010 Express)

  • opencv_core248.lib, opencv_highgui248.lib, opencv_imgproc248.lib とリンクしてください。実行時にはそれぞれのDLLが必要です。
  • Windows以外では適当に読み替えてください。stdafx.h, windows.h, _TCHARあたりをどうにかすれば大丈夫かと思います。あと、動画ファイルの形式も変更する必要があるかと思います。
  • C++インタフェースとCインタフェースが混じっています。読みにくくてすみません。(自分の中で過渡期です)
  • 超解像のパラメータ(rfactor, iterations)をいじってみるとか、画像サイズを変えてみるとか、イロイロやってみてください。
#include "stdafx.h"
#include <windows.h>
#include <opencv2/opencv.hpp>
#include <opencv2/superres/superres.hpp>
using namespace std;
using namespace cv;
using namespace cv::superres;

int _tmain(int argc, _TCHAR* argv[]) {
    const char* video_pathname = "Wildlife_120x90.avi";
    int rfactor = 2;//超解像倍率
    int iterations = 4;//繰り返し回数
    int vfactor = 2;//表示拡大率
    int inter_method = CV_INTER_NN;//拡大表示時の補間方法

    //表示用ウィンドウの準備
    cvInitSystem(argc, argv);
    cvNamedWindow("Original Frame", CV_WINDOW_AUTOSIZE);
    cvNamedWindow("Super Resolution", CV_WINDOW_AUTOSIZE);
    // 超解像度処理用クラスの生成
    Ptr<SuperResolution> superResolution =
        createSuperResolution_BTVL1();
    Ptr<FrameSource> fs = createFrameSource_Video(video_pathname);
    superResolution->setInput(fs);
    superResolution->set("scale", rfactor);
    superResolution->set("iterations", iterations);
    Mat sr_output;//超解像結果
    Mat sr_large;//拡大表示用画像

    //オリジナル画像表示用のキャプチャ
    CvCapture* capture = cvCreateFileCapture(video_pathname);
    IplImage* captured_frame = 0;
    while((captured_frame = cvQueryFrame(capture)) != 0) {
        //超解像処理
        superResolution->nextFrame(sr_output);
        //超解像を拡大表示
        resize(sr_output, sr_large, 
            cvSize( sr_output.cols * vfactor, 
                    sr_output.rows * vfactor),
            0.0, 0.0, inter_method);
        imshow("Super Resolution", sr_large);
        //オリジナル画像を拡大表示
        IplImage* orig_frame = cvCreateImage(
            cvSize( captured_frame->width * rfactor * vfactor, 
                    captured_frame->height * rfactor * vfactor),
            captured_frame->depth, captured_frame->nChannels);
        cvResize(captured_frame, orig_frame, inter_method);
        cvShowImage("Original Frame", orig_frame);
        cvReleaseImage(&orig_frame);

        //キー入力処理
        int ch = cvWaitKey (1);
        if (ch == '\x1b') {
            fprintf(stderr, "pause.\n");
            while((ch = cvWaitKey(100)) == -1) {/**/}
            if (ch == '\x1b') {
                break;
            } else {
                fprintf(stderr, "restart.\n");
            }
        }
    }
    cvDestroyAllWindows();
    cvReleaseCapture(&capture);
    return 0;
}

関連文書


Pythonプロフェッショナルプログラミング 第2版
秀和システム (2015-05-21)
売り上げランキング: 1,813


クラウドではじめる機械学習 Azure MLでらくらく体験
脇森浩志 杉山雅和 羽生貴史
リックテレコム
売り上げランキング: 2,081

実践Node.js プログラミング (Programmer's SELECTION)
Mike Cantelon Marc Harter T.J. Holowaychuk Nathan Rajlich
翔泳社
売り上げランキング: 40,213

■ たかみんつ / ソフト開発メモINDEX / OpenCVリファレンス(じぶん用) / 関数・クラスの使い方・サンプルなど /



RSS Feed Widget
[opencv] SuperResolutionで動画の超解像を行う
(http://bicycle.life.coocan.jp/takamints/index.php/doc/opencv/doc/sr_video_sample)
by Koji Takami ( email: vzg03566@gmail.com, GitHub: takamin )