2016-04-26 148 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

可能是什麼原因行爲?

P.S. documentation says即cv :: waitKey()返回int,那麼爲什麼我們應該將其轉換爲char

回答

4

此功能是高度依賴於操作系統:/他們中的一些位添加到整數....

它應該返回按鍵的ASCII碼,例如,27是ASCII代碼爲ESC鍵...

現在,問題是要知道當您將int轉換爲char時會發生什麼。

在這種情況下:這是實現定義....(這是標準說什麼),這裏是一個link到一個類似的案件

一些解決方案

1)把它變成char變量......儘管它是實現定義的,但它似乎是最常用的工作解決方案之一(在一些opencv樣本中,它們使用它)

2)use int key = cv::waitKey(1) & 255。這將消除額外的比特...

要走遠一點,讓檢查值:

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

正如你可以看到他們在孤立比特的不同....的safetest和最可移植的方式是使用按位邏輯操作(如我的第2號解決方案)將其刪除。其他人使用一些十六進制值而不是255,如0xEFFFFF在二進制中它將是

00000000 11101111 11111111 11111111 

爲什麼會發生這種情況?

我搜索了一次,似乎有一些位變化,如果你有numslockcapslockctrl鍵激活...再次,這是平臺相關的。