gpt4 book ai didi

c++ - Opencv cv::waitKey() 返回值

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:35:09 24 4
gpt4 key购买 nike

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

这种行为的原因是什么?

附言documentation says cv::waitKey() 返回 int,那么我们为什么要把它转换成 char

最佳答案

此功能高度依赖于操作系统:/其中一些会向整数添加一位....

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

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

在这种情况下:它是实现定义的....(这是标准所说的)这里是一个 link类似案例

一些解决方案:

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 键,似乎某些位会发生变化。 . 同样,这取决于平台。

关于c++ - Opencv cv::waitKey() 返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36860683/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com