Skip to content

highgui(WITH_GTK=ON)の振る舞いが違う理由を調べる

atinfinity edited this page Apr 23, 2017 · 19 revisions

highgui(WITH_GTK=ON)の振る舞いが違う理由を調べる

はじめに

highguiのバックエンドとしてGTK2,GTK3を使うケースでウィンドウ表示の振る舞いが違っていることに気付いたので原因を調べたときのメモ書きです.

サンプルコード

#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>

int main(int argc, const char* argv[])
{
  cv::Mat src = cv::imread("lena.jpg", cv::IMREAD_COLOR);
  if(src.empty())
  {
    std::cerr << "Failed to open image file." << std::endl;
    return -1; 
  }

  cv::namedWindow("image", cv::WINDOW_NORMAL);
  cv::imshow("image", src);
  cv::waitKey(0);
  cv::destroyAllWindows();

  return 0;
}

実行結果

前述のサンプルコードを実行した結果を以下に示します.

GTK2 GTK3
GTK2 GTK3

この結果よりhighguiのバックエンドとしてGTK2,GTK3を使った場合で以下の振る舞いの違いがあることがわかりました.

  • GTK2版
    • 320x240のウィンドウに合わせたウィンドウ表示
    • ウィンドウはユーザがリサイズ可
  • GTK3版
    • 画像サイズに合わせたウィンドウ表示
    • ウィンドウはユーザがリサイズ可

調査結果

なぜこのような差異が出るのかわからなかったのでmodules/highgui/src/window_gtk.cppの処理を読んだところ,GTK2とGTK3を使う場合でフラグを使ったウィンドウサイズのハンドリングが異なることがわかりました.

詳細は下記関数の実装を参照ください.

OpenCVのバグなのか?

公式ドキュメントを読むとWINDOW_NORMALフラグは「ユーザがリサイズ可能なウィンドウにする」ことを規定しています.
GTK2,GTK3を使ったケースではウィンドウ表示の振る舞いは違うものの「ユーザがリサイズ可能なウィンドウ」となっているため,いずれもOpenCVの仕様には反していないように思えます.

とはいえ,フラグを使ったウィンドウサイズのハンドリングをGTK2,GTK3で変える必要性も見当たらないので,個人的には振る舞いを統一してほしい気もします.

備考

筆者は以下の環境で動作確認しました.


Menu

Computer Vision

GPGPU

AR

ROS

Docker

Jetson

ARM

プログラミング言語

開発環境

勉強会

Clone this wiki locally