Opencv cv::waitKey() return value

Opencv cv::waitKey() return value

本文关键字:return value waitKey cv Opencv      更新时间:2023-10-16

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

这种行为的原因可能是什么?

附言文档说 cv::waitKey() 返回int,那么为什么我们应该将其转换为 char 呢?

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

它应该返回按键的 ASCII 代码,例如,27ESC键的 ASCII 代码...

现在,问题是知道当您将 int 转换为char时会发生什么。

在本例中:它是实现定义的。(这就是标准所说的)这是类似案例的链接

一些解决方案

1)将其放入字符变量中...尽管它是实现定义的,但它似乎是最常见的工作解决方案之一(在某些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密钥处于活动状态,似乎有些位会发生变化......同样,这取决于平台。