繁体   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