Opencv cv :: waitKey()返回值

mrg*_*oom 4 c++ opencv

我正在调试一些在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();
    }

    ...
Run Code Online (Sandbox Code Playgroud)

但是这个代码不起作用,而且我的输出也没有 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();
    }

    ...
Run Code Online (Sandbox Code Playgroud)

这段代码工作正在输出中 key_pressed 27

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

PS 文档说 cv :: waitKey()返回int,为什么我们应该将它转换为char

api*_*i55 6

此函数高度依赖于操作系统:/其中一些向整数添加一些内容....

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

现在,问题是要知道将int转换为a时会发生什么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
Run Code Online (Sandbox Code Playgroud)

正如你所看到的那样,它们的区别在于......最安全,最便携的方法是使用按位逻辑运算将其删除,例如我的2号解决方案.其他人使用一些十六进制值而不是255,例如0xEFFFFF,它将是二进制的

00000000 11101111 11111111 11111111
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

我搜索了这一次,似乎有些位的变化,如果你有numslockcapslockctrl关键的活性......再次,这是依赖于平台.