2016-04-26 59 views
2

私はUbuntu 14でOpenCVを使用するいくつかのC++コードをデバッグしています。これはUbuntu 12と他のOpenCVライブラリビルドで動作することが知られています。OpenCV cv :: waitKey()戻り値

int key_pressed = waitKey(0); 
cout << "key_pressed " << int(key_pressed) << endl; 
switch(key_pressed) 
{ 
    case 27: //esc 
    { 
     //close all windows and quit 
     destroyAllWindows(); 
    } 

    ... 

前に、何でした。しかし、このコードは動作していないと出力に私が持っているkey_pressed 1048603

このコード作業:このコードは、働いていると出力に私が持っている

char key_pressed = cv::waitKey(); 
cout << "key_pressed " << int(key_pressed) << endl; 
switch(key_pressed) 
{ 
    case 27: //esc 
    { 
     //close all windows and quit 
     destroyAllWindows(); 
    } 

    ... 

key_pressed 27

suの理由chの行動?

P.S. documentation saysそのcv :: waitKey()はintを返します。なぜそれをcharに変換する必要がありますか?

答えて

4

この機能は、オペレーティングシステムに大きく依存している:それらの/一部は整数にビットを追加....

それがキープレスのASCIIコードを返す必要があり、例えば、27は、ASCIIでありますESCキーのコード...

ここで問題は、intをcharにキャストするときに何が起こるかを知ることです。この場合

:それは実装定義である....(それは標準が言うことである)、ここでlink

同様のケースにいくつかの ソリューションです:

1)がそれを置きますchar型の変数に変換します...実装定義ではありますが、これは最も一般的な作業の解決策の1つです(int key = cv::waitKey(1) & 255を使用してください)。

2)を使用してください。 safetest最も....

You obtained as an int: 1048603 
in binary it will be: 00000000 00010000 00000000 00011011 
27 in binary is:  00000000 00000000 00000000 00011011 

あなたは彼らが唯一のビットが異なって見ることができるように:それは、値を確認することができます、少し先に進むために...

を余分なビットを排除します移植可能な方法は、ビット2の論理演算(例えば、マイナンバー2の解法)でそれを削除することです。他の人は、バイナリでは0xEFFFFFのように255ではなく255の値を使用します。

00000000 11101111 11111111 11111111 

これはどうしてですか?

私はこれを一度検索しましたが、numslockまたはcapslockまたはctrlキーがアクティブな場合、ビットの一部が変更されたように見えます。これは再びプラットフォームに依存します。