OpenCV cv::waitKey() 返回值

4

我正在调试一些在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

出现这种情况的原因可能是什么呢?

P.S. 文档中提到 cv::waitKey() 返回一个 int 值,那么我们为什么需要将其转换成 char 呢?

1个回答

6

这个函数高度依赖于操作系统 :/ 其中一些会在整数上添加一个位....

它应该返回按键的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

正如你所看到的,它们在那个孤立的位上有所不同...最安全和最便携的方法是使用位逻辑操作来删除它,例如我的第二种解决方案。其他人使用一些十六进制值代替255,例如0xEFFFFF,在二进制中将是

00000000 11101111 11111111 11111111

为什么会出现这种情况?

我曾经搜索过一次,似乎如果你的键盘开启了Num LockCaps LockCtrl键,则某些位可能会发生变化... 再次说明,这取决于平台。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接