OpenCV 2.1からOpenCV 2.2に切り替えてみたら,エンターキーをcvWaitKeyで拾わなくなった気がするので,検証してみた.
OpenCV 2.3*1でbugfixされた
- OpenCV 2.1 のビルドオプションはほぼデフォルト*2
- OpenCV 2.2 はWITH_QTでビルド.*3
検証内容†
- OpenCVのcvWaitKey(C++インタフェースだとcv::waitKey)は押されたキーを拾って,int型のASCIIコードを返す.
- 何も押されなかったら-1を返す.
- エンターキーは13に対応するのだが,Qtを有効にしたOpenCV 2.2でどう反応するか以下のコードでテスト
#geshi(c++, number){{
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include <iostream>
const char WINDOW_NAME[] = "OpenCV";
int main(int argc, char **argv){
cvNamedWindow(WINDOW_NAME);
int q;
while(q = cvWaitKey(0),q != 'q'){ // qが押されたら終了
std::cout << ' ' << q ;
}
cvDestroyWindow(WINDOW_NAME);
return 0;
}
}}
- これ以上ないほどシンプルなソースコード
- 押されたキーのASCIIコードを返す
検証結果(OpenCV 2.1)†
- 多数のキーの反応を返す
- ファンクションキー,矢印キー,InsertやHomeキーなどにも反応した.
- 反応しなかったのはCtrl,Shift,Altなどの特殊キーばかり
検証結果(OpenCV 2.2)†
- Enterキーを押しても反応が無い
- Backspaceキーも反応が無い
- 他のキーは反応がある
- 2.1と比べて,以下のキーが確認できない
- Enter キー
- Backspace キー
- ファンクションキー
- Insert キー
- Page Up/Down キー
- End キー
- Home キー
- Delete キー
検証結果(OpenCV 2.2 + CV_GUI_NORMAL)†
- OpenCV 2.2には,Qtを有効にした場合,通常のウィンドウ(旧来のウィンドウ)を有効にするCV_GUI_NORMALというオプションが付く
- 9行目を以下のように変更することで,従来のOpenCVのウィンドウを呼べる
#geshi(c++){{
-cvNamedWindow(WINDOW_NAME);
+cvNamedWindow(WINDOW_NAME,CV_WINDOW_AUTOSIZE|CV_WINDOW_KEEPRATIO|CV_GUI_NORMAL);
}}
- Qtのウィンドウの時と変わらず
- Qtのウィンドウを使う使わないに関わらず,ライブラリに問題があるっぽい.
検証結果(OpenCV 2.2 C++インタフェース)†
- 上記のプログラムをC++インタフェースで書き換えてみた*4が,同様の結果に
まとめ†
- 鳴り物入りで登場したQtバックエンドであるが,まだまだBuggyな面があるっぽい.
- おそらく,原因はWITH_QTを有効にしてOpenCVをビルドしたこと.
- ソースコードを追えば原因があるかも知れないが,現状できる最短の
解決策はOpenCV 2.1を使えということか.orz....
- OpenCV 2.3で解決されたので,そちらを使うべし.もしくはOpenCV 2.2 でWITH_QTを無効にしてビルドする
- っていうか,2.1で意外にキーを拾えたんだな.ファンクションキーも使えたんだ,知らなかった.
ジャンル:OpenCV:OpenCV 2.1:OpenCV 2.2:OpenCV 2.3