highgui(WITH_GTK=ON)の振る舞いが違う理由を調べる - atinfinity/lab GitHub Wiki
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 |
この結果よりhighguiのバックエンドとしてGTK2,GTK3を使った場合で以下の振る舞いの違いがあることがわかりました.
- GTK2版
- 320x240のウィンドウに合わせたウィンドウ表示
- ウィンドウはユーザがリサイズ可
- GTK3版
- 画像サイズに合わせたウィンドウ表示
- ウィンドウはユーザがリサイズ可
なぜこのような差異が出るのかわからなかったのでmodules/highgui/src/window_gtk.cppの処理を読んだところ,GTK2とGTK3を使う場合でフラグを使ったウィンドウサイズのハンドリングが異なることがわかりました.
詳細は下記関数の実装を参照ください.
- GTK2版:
- GTK3版:
公式ドキュメントを読むとWINDOW_NORMAL
フラグは「ユーザがリサイズ可能なウィンドウにする」ことを規定しています.
GTK2,GTK3を使ったケースではウィンドウ表示の振る舞いは違うものの「ユーザがリサイズ可能なウィンドウ」となっているため,いずれもOpenCVの仕様には反していないように思えます.
とはいえ,フラグを使ったウィンドウサイズのハンドリングをGTK2,GTK3で変える必要性も見当たらないので,個人的には振る舞いを統一してほしい気もします.
筆者は以下の環境で動作確認しました.
- OpenCV 3.2.0
- Ubuntu 16.04 64bit
- gcc 5.4.0