[英]Opencv cv::waitKey() return value
我正在調試一些在Ubuntu 14上使用OpenCV的C ++代碼,這些代碼已知可以在Ubuntu 12上使用,並且可能與其他OpenCV庫構建一起使用。
以前是什么
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
這種行為的原因是什么?
PS 文檔說 cv :: waitKey()返回int
,那么為什么我們應該將其轉換為char
?
此功能高度依賴於操作系統:/其中一些會對整數加一點...。
它應該返回按鍵的ASCII碼,例如27
是ESC
鍵的ASCII碼...
現在,問題是要知道將int轉換為char
時會發生什么。
在這種情況下:這是實現定義的...。(這就是標准所說的)這里是指向類似情況的鏈接
一些解決方案 :
1)將其放入char變量中...即使它是實現定義的,也似乎是最常見的工作解決方案之一(在某些使用它的opencv示例中)
2)使用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
如您所見,它們的區別僅在於此……。最安全,最可移植的方法是使用按位邏輯運算(例如我的2號解決方案)將其刪除。 其他人使用一些十六進制值而不是255,例如0xEFFFFF,在二進制中它將是
00000000 11101111 11111111 11111111
為什么會這樣?
我搜索了這一次,似乎有些變化位,如果你有numslock
或capslock
或ctrl
活躍......再次關鍵,這是依賴於平台。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.