C++ Opencv cv::waitKey()返回值
我调试了一些在Ubuntu 14上使用OpenCV的C++代码,它在Ubuntu 12上工作,可能与其他OpenCV库构建。 以前是什么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
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