2014年6月16日月曜日

OpenCVで超解像処理

OpenCVには超解像処理モジュールがあり、これを利用することで簡単に超解像処理を実行することが出来る。

使い方は、SuperResolutionクラスを生成し、入力画像系列の指定、各種パラメータの設定(必要に応じて)を行うだけ。ただし、モジュールを使用するためにはsuperres.hppのインクルードとopencv_superresxxx.libのリンクが必要。

#include <opencv2/opencv.hpp>

//SuperResolutionモジュールを使うために必要
#include <opencv2/superres.hpp>

int main(int argc, char** argv)
{
  //SuperResolutionクラスを生成
  cv::Ptr<cv::superres::SuperResolution> superResolution = cv::superres::createSuperResolution_BTVL1();

  //入力画像系列の指定とパラメータの指定
  superResolution->setInput(cv::superres::createFrameSource_Video("elephant.avi"));
  superResolution->set("iterations", 20);
  superResolution->set("scale", 2);

  //結果出力
  cv::namedWindow("SuperResolved");
  cv::namedWindow("Original(scaled)");

  //オリジナルのビデオ
  cv::VideoCapture cap("elephant.avi");
  cv::Mat original;

  while( 1 )
  {
    cv::Mat frame;
    //超解像結果の取り出し
    superResolution->nextFrame( frame );
    if(frame.empty())
      break;

    //オリジナルを単純リサイズ
    cap >> original;
    cv::resize(original, original, cv::Size(640, 480));

    //単純リサイズと超解像結果の表示
    cv::imshow("SuperResolved", frame);
    cv::imshow("Original(scaled)", original);
    cv::waitKey(30);
  }
  return 0;
}


以下、結果。あまり違いが分からない。。。超解像度処理結果の方が若干シャープな感じもする。ただ、結構処理に時間が掛かる割に得られる結果のクオリティが低い気がする。入力が悪かったのかなぁ。

・ 超解像結果

・ 単純にリサイズした結果

 


0 件のコメント:

コメントを投稿