Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Opencv cv::waitKey()返回值_C++_Opencv - Fatal编程技术网

C++ Opencv cv::waitKey()返回值

C++ Opencv cv::waitKey()返回值,c++,opencv,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

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

    ...
此代码正在工作,在输出中我已按下27键

这种行为的原因是什么


另外,cv::waitKey()返回
int
,那么我们为什么要将其转换为
char

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

它应该返回按键的ascii码,例如,
27
ESC
按键的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,例如二进制中的0xeffff

00000000 11101111 11111111 11111111
为什么会发生这种情况

我搜索过一次,如果您有
numslock
capslock
ctrl
键处于活动状态,似乎有些位会发生变化。。。同样,这取决于平台

00000000 11101111 11111111 11111111