簡體   English   中英

Opencv cv :: waitKey()返回值

[英]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碼,例如27ESC鍵的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

為什么會這樣?

我搜索了這一次,似乎有些變化位,如果你有numslockcapslockctrl活躍......再次關鍵,這是依賴於平台。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM