2
2

More than 3 years have passed since last update.

C++版OpenCVでトラックバーを表示してみた

Last updated at Posted at 2019-10-16

なぜ必要か

OpenCVで油絵エフェクトは1行でかけるとのことです。(C++限定)oilPainting を紹介しました。 公式ドキュメントでoilPainting() を詳しくみると、、、

void cv::xphoto::oilPainting    
        (InputArray     src,
         OutputArray    dst,
        int     size,
        int     dynRatio,
        int     code 
)

size dynRatio などのパラメータが用意されています。

documentには

  • size : neighbouring size is 2-size+1 (隣接サイズ 2-size+1)
  • dynRatio : image is divided by dynRatio before histogram processing (ヒストグラム処理の前に動的比率で分割する)

と書かれていますが、これだけではよくわかりません。

おそらく他のクラス・メソッドもすぐには理解できないパラメータが多く含まれていると思います。仮にdocumentが充実していても難しい内容が含まれている可能性があります。
幸い扱っているデータソースが画像なので、処理をかけると何らかの出力がなされるのでそこから類推することもできます。

今回説明するトラックバーはパラメータを可変に動かすことで出力画像を表示することができるので、どのようにパラメータが使われているか確認するために用いています。

開発

#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/xphoto.hpp>

cv::Mat src = cv::imread("./mikan.jpg");
int nsize_slider = 2;
int r_slider = 1;

void nsize_trackbar( int size, void*)
{
   cv::Mat dst;   
   cv::xphoto::oilPainting(src, dst, size, r_slider, cv::COLOR_BGR2Lab);
   cv::imshow("oil painting effect", dst);
}

void dynRatio_trackbar( int r, void* )
{
   cv::Mat dst;   
   cv::xphoto::oilPainting(src, dst, nsize_slider, r, cv::COLOR_BGR2Lab);
   cv::imshow("oil painting effect", dst);
}

int main(int argc, const char* argv[]) {

   if (src.empty()) {
      std::cout << "read error.\n";
      return -1;
   }

   cv::namedWindow("oil painting effect", cv::WINDOW_AUTOSIZE);

   //トラックバー表示
   cv::createTrackbar("neighbouring size", "oil painting effect", &nsize_slider, 20, nsize_trackbar);
   cv::setTrackbarPos("neighbouring size", "oil painting effect", 5);
   cv::setTrackbarMin("neighbouring size", "oil painting effect", 2);

   cv::createTrackbar("dynRatio", "oil painting effect", &r_slider, 10, dynRatio_trackbar );
   cv::setTrackbarPos("dynRatio", "oil painting effect", 3);
   cv::setTrackbarMin("dynRatio", "oil painting effect", 1);

   //最初の表示
   nsize_trackbar(2, NULL);
   dynRatio_trackbar(1, NULL);

   cv::waitKey(0);
   src.release();
   cv::destroyAllWindows();

   return 0;
}
void nsize_trackbar( int size, void*)
{
   cv::Mat dst;   
   cv::xphoto::oilPainting(src, dst, size, r_slider, cv::COLOR_BGR2Lab);
   cv::imshow("oil painting effect", dst);
}

はコールバック関数で、ユーザが動かしたトラックバーの値と同期しています。例えばトラックバーsizeを10にするとoilPaintingsizeは10として画像処理されます。

結果

output.gif

メソッド内の処理は詳しくはわかりませんが、アプリを開いてトラックバーを動かしてみると (neighbour)size はペンの太さ、dynRatioはペンのかすれ具合と同義なのがわかります。

おわりに

cv::Mat src = cv::imread("./mikan.jpg");
int nsize_slider = 2;
int r_slider = 1;

をグローバル変数で宣言していますが cv::createTrackbaruserdata を使うとローカルのコールバック関数の引数として使えるっぽいのですが、次回のまとめはこの引数についてネタにするかもしれんす。:thinking:

参考になりそうなリンク

2
2
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
2
2